opencv中 cv2.KeyPoint和cv2.DMatch的理解
阿新 • • 發佈:2018-11-23
cv2.KeyPoint是opencv中關鍵點檢測函式detectAndCompute()返回的關鍵點的類,他包含關鍵點的位置,方向等屬性具體如下:
#point2f pt;//位置座標
# float size; // 特徵點鄰域直徑
#float angle; // 特徵點的方向,值為[零, 三百六十),負值表示不使用
# float response;
# int octave; // 特徵點所在的影象金字塔的組
# int class_id; // 用於聚類的id
程式碼如下:
#關鍵點屬性 import cv2 img1 = cv2.imread('./data/33.jpg',0) # Initiate SIFT detector sift = cv2.xfeatures2d.SIFT_create() # find the keypoints and descriptors with SIFT kp1, des1 = sift.detectAndCompute(img1,None) print("資料型別:",type(kp1[0])) print("關鍵點座標:",kp1[0].pt)#第一個關鍵點位置座標 print("鄰域直徑:",kp1[0].size)#關鍵點鄰域直徑
執行結果:
資料型別: <class 'cv2.KeyPoint'>
關鍵點座標: (6.030540943145752, 39.67108917236328)
鄰域直徑: 2.439194679260254
cv2.DMatch是opencv中匹配函式(例如:knnMatch)返回的用於匹配關鍵點描述符的類,這個DMatch 物件具有下列屬性:
• DMatch.distance - 描述符之間的距離。越小越好。
• DMatch.trainIdx - 目標影象中描述符的索引。
• DMatch.queryIdx - 查詢影象中描述符的索引。
• DMatch.imgIdx - 目標影象的索引。
程式碼如下:
import cv2 img1 = cv2.imread('./data/33.jpg',0) # queryImage img2 = cv2.imread('./data/3.jpg',0) # trainImage # Initiate SIFT detector orb = cv2.ORB_create() # find the keypoints and descriptors with SIFT kp1, des1 = orb.detectAndCompute(img1,None) kp2, des2 = orb.detectAndCompute(img2,None) # create BFMatcher object bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # Match descriptors. matches = bf.match(des1,des2) print("資料型別:",type(matches[0]))#檢視型別 print("描述符之間的距離:",matches[0].distance)# 描述符之間的距離。越小越好。 print("影象中描述符的索引:",matches[0].queryIdx)#查詢影象中描述符的索引。
執行結果:
資料型別: <class 'cv2.DMatch'>
描述符之間的距離: 28.0
影象中描述符的索引: 0