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 

猜你喜欢

转载自blog.csdn.net/qq_29023939/article/details/81130987