1. 程式人生 > >opencv-python下簡單KNN分類識別

opencv-python下簡單KNN分類識別

文件 ont and color div feature png image spa

KNN是數據挖掘中一種簡單算法常用來分類,此次用來聚類實現對4種花的簡單識別。

環境:python2.7+opencv3.0+windows10

原理:在使用KNN函數提取出4種花特征點以後,對需要辨認的圖片提取體征點,與圖庫中4類花進行比較,匹配點最多的一類即視為同類。

代碼:

讀入圖像數據:

 1 
 2     img =cv2.imread(name)
 3   
 4     q_img=[1]*10
 5     q_img[0] = cv2.imread("images/qiangwei1.jpg")
 6     q_img[1] = cv2.imread("images/qiangwei2.jpg
") 7 q_img[2] = cv2.imread("images/qiangwei3.jpg") 8 q_img[3] = cv2.imread("images/qiangwei4.jpg") 9 q_img[4] = cv2.imread("images/qiangwei5.jpg") 10 11 x_img=[1]*10 12 x_img[0] = cv2.imread("images/xinghua1.jpg") 13 x_img[1] = cv2.imread("images/xinghua2.jpg") 14 x_img[2] = cv2.imread("
images/xinghua3.jpg") 15 x_img[3] = cv2.imread("images/xinghua4.jpg") 16 x_img[4] = cv2.imread("images/xinghua5.jpg") 17 18 t_img=[1]*10 19 t_img[0] = cv2.imread("images/taohua1.jpg") 20 t_img[1] = cv2.imread("images/taohua2.jpg") 21 t_img[2] = cv2.imread("images/taohua3.jpg") 22 t_img[3] = cv2.imread("
images/taohua4.jpg") 23 t_img[4] = cv2.imread("images/taohua5.jpg") 24 25 y_img=[1]*10 26 y_img[0] = cv2.imread("images/yinghua1.jpg") 27 y_img[1] = cv2.imread("images/yinghua2.jpg") 28 y_img[2] = cv2.imread("images/yinghua3.jpg") 29 y_img[3] = cv2.imread("images/yinghua4.jpg") 30 y_img[4] = cv2.imread("images/yinghua5.jpg")

獲取灰度圖:

    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  
    q_gray=[1]*10
    q_gray[0] = cv2.cvtColor(q_img[0],cv2.COLOR_BGR2GRAY)
    q_gray[1] = cv2.cvtColor(q_img[1],cv2.COLOR_BGR2GRAY)
    q_gray[2] = cv2.cvtColor(q_img[2],cv2.COLOR_BGR2GRAY)
    q_gray[3] = cv2.cvtColor(q_img[3],cv2.COLOR_BGR2GRAY)
    q_gray[4] = cv2.cvtColor(q_img[4],cv2.COLOR_BGR2GRAY)

    x_gray=[1]*10
    x_gray[0] = cv2.cvtColor(x_img[0],cv2.COLOR_BGR2GRAY)
    x_gray[1] = cv2.cvtColor(x_img[1],cv2.COLOR_BGR2GRAY)
    x_gray[2] = cv2.cvtColor(x_img[2],cv2.COLOR_BGR2GRAY)
    x_gray[3] = cv2.cvtColor(x_img[3],cv2.COLOR_BGR2GRAY)
    x_gray[4] = cv2.cvtColor(x_img[4],cv2.COLOR_BGR2GRAY)
  
    t_gray=[1]*10
    t_gray[0] = cv2.cvtColor(t_img[0],cv2.COLOR_BGR2GRAY)
    t_gray[1] = cv2.cvtColor(t_img[1],cv2.COLOR_BGR2GRAY)
    t_gray[2] = cv2.cvtColor(t_img[2],cv2.COLOR_BGR2GRAY)
    t_gray[3] = cv2.cvtColor(t_img[3],cv2.COLOR_BGR2GRAY)
    t_gray[4] = cv2.cvtColor(t_img[4],cv2.COLOR_BGR2GRAY)
  
    y_gray=[1]*10
    y_gray[0] = cv2.cvtColor(y_img[0],cv2.COLOR_BGR2GRAY)
    y_gray[1] = cv2.cvtColor(y_img[1],cv2.COLOR_BGR2GRAY)
    y_gray[2] = cv2.cvtColor(y_img[2],cv2.COLOR_BGR2GRAY)
    y_gray[3] = cv2.cvtColor(y_img[3],cv2.COLOR_BGR2GRAY)
    y_gray[4] = cv2.cvtColor(y_img[4],cv2.COLOR_BGR2GRAY)

獲取keypoints,descriptor:

    detect = cv2.xfeatures2d.SIFT_create(800)

    kp,des = detect.detectAndCompute(gray,None)
    
    
    q_kp=[1]*10
    q_des=[1]*10
    q_kp[0],q_des[0] = detect.detectAndCompute(q_gray[0],None)
    q_kp[1],q_des[1] = detect.detectAndCompute(q_gray[1],None)
    q_kp[2],q_des[2] = detect.detectAndCompute(q_gray[2],None)
    q_kp[3],q_des[3] = detect.detectAndCompute(q_gray[3],None)
    q_kp[4],q_des[4] = detect.detectAndCompute(q_gray[4],None)

    x_kp=[1]*10
    x_des=[1]*10
    x_kp[0],x_des[0] = detect.detectAndCompute(x_gray[0],None)
    x_kp[1],x_des[1] = detect.detectAndCompute(x_gray[1],None)
    x_kp[2],x_des[2] = detect.detectAndCompute(x_gray[2],None)
    x_kp[3],x_des[3] = detect.detectAndCompute(x_gray[3],None)
    x_kp[4],x_des[4] = detect.detectAndCompute(x_gray[4],None)
  
    t_kp=[1]*10
    t_des=[1]*10
    t_kp[0],t_des[0] = detect.detectAndCompute(t_gray[0],None)
    t_kp[1],t_des[1] = detect.detectAndCompute(t_gray[1],None)
    t_kp[2],t_des[2] = detect.detectAndCompute(t_gray[2],None)
    t_kp[3],t_des[3] = detect.detectAndCompute(t_gray[3],None)
    t_kp[4],t_des[4] = detect.detectAndCompute(t_gray[4],None)
    
    y_kp=[1]*10
    y_des=[1]*10
    y_kp[0],y_des[0] = detect.detectAndCompute(y_gray[0],None)
    y_kp[1],y_des[1] = detect.detectAndCompute(y_gray[1],None)
    y_kp[2],y_des[2] = detect.detectAndCompute(y_gray[2],None)
    y_kp[3],y_des[3] = detect.detectAndCompute(y_gray[3],None)
    y_kp[3],y_des[4] = detect.detectAndCompute(y_gray[4],None)

使用Knn匹配類進行匹配:

  bf = cv2.BFMatcher()
    q_matches=[1]*10
    q_matches[0]= bf.knnMatch(des,q_des[0],k=2)
    q_matches[1]= bf.knnMatch(des,q_des[1],k=2)
    q_matches[2]= bf.knnMatch(des,q_des[2],k=2)
    q_matches[3]= bf.knnMatch(des,q_des[3],k=2)
    q_matches[4]= bf.knnMatch(des,q_des[4],k=2)

    x_matches=[1]*10
    x_matches[0]= bf.knnMatch(des,x_des[0],k=2)
    x_matches[1]= bf.knnMatch(des,x_des[1],k=2)
    x_matches[2]= bf.knnMatch(des,x_des[2],k=2)
    x_matches[3]= bf.knnMatch(des,x_des[3],k=2)
    x_matches[4]= bf.knnMatch(des,x_des[4],k=2)
    
    t_matches=[1]*10
    t_matches[0]= bf.knnMatch(des,t_des[0],k=2)
    t_matches[1]= bf.knnMatch(des,t_des[1],k=2)
    t_matches[2]= bf.knnMatch(des,t_des[2],k=2)
    t_matches[3]= bf.knnMatch(des,t_des[3],k=2)
    t_matches[4]= bf.knnMatch(des,t_des[4],k=2)
  
    y_matches=[1]*10
    y_matches[0]= bf.knnMatch(des,y_des[0],k=2)
    y_matches[1]= bf.knnMatch(des,y_des[1],k=2)
    y_matches[2]= bf.knnMatch(des,y_des[2],k=2)
    y_matches[3]= bf.knnMatch(des,y_des[3],k=2)
    y_matches[4]= bf.knnMatch(des,y_des[4],k=2)
  

記錄並對匹配點進行篩選:

sum1=0
    sum2=0
    sum3=0
    sum4=0
    for i in range(5):
      for m,n in q_matches[i]:
        if m.distance < 0.55*n.distance:
          sum1=sum1+1
  
    for i in range(5):
      for m,n in x_matches[i]:
        if m.distance < 0.55*n.distance:
          sum2=sum2+1
          
    for i in range(5):
      for m,n in t_matches[i]:
        if m.distance < 0.55*n.distance:
          sum3=sum3+1
  
    for i in range(5):
      for m,n in y_matches[i]:
        if m.distance < 0.55*n.distance:
          sum4=sum4+1

返回結果:

if max(sum1,sum2,sum3,sum4)==sum1:
      return "薔薇"
  
    if max(sum1,sum2,sum3,sum4)==sum2:
      return "杏花"
  
    if max(sum1,sum2,sum3,sum4)==sum3:
      return "桃花"
  
    if max(sum1,sum2,sum3,sum4)==sum4:
      return "櫻花"

gui使用利用wxformbuilder+wxpython開發的簡單頁面

最終文件:

技術分享圖片

效果圖如下:

技術分享圖片 技術分享圖片

由於圖庫圖片較少且算法較為簡單,識別率不會很高。

opencv-python下簡單KNN分類識別