1. 程式人生 > >opencv中 cv2.KeyPoint和cv2.DMatch的理解

opencv中 cv2.KeyPoint和cv2.DMatch的理解

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