sfm中使用了这个knnmatch,但是实际应用是取了其中的一个DMatch
注意这其中的DMatch的数据结构
'''
一对匹配点一个match,但是对于knn来说就是聚类分析,选取了n个匹配点,加入了一下约束距离
然后,match中的数据结构会对应着keypoint 和 descriptor中的下标
'''
bf = cv2.BFMatcher(cv2.NORM_L2)
# knn.match(,k = X)
# 输出的是 k 个匹配上的特征点
#也就是排在 k 排名的最优的点
knn_matches = bf.knnMatch(query, train, k=2)
for m, n in knn_matches:
if m.distance < config.MRT * n.distance:
# print(m)
'''
下面的三个变量是DMatch的数据结构
'''
# 目标图像的特征点的下标 以及描述符的下标
print(m.queryIdx)
# 源图像的特征点下标以及描述符下标 其实就是key_point的下标以及descriptor的下标
print(m.trainIdx)
# 两个描述符之间的距离
print(m.distance)
matches.append(m)
keypoint的数据结构
.pt:关键点坐标,.angle:表示关键点方向,.response表示响应强度,.size:标书该点的直径大小。
print(key1[matche.queryIdx].pt)