opencv中 在特征点匹配代码举例,以及queryIdx和trainIdx的用法

一、用法

在特征点匹配中,queryIdx和trainIdx是匹配对中的两个索引,用于指示匹配点在不同图像或特征向量中的位置。
1.假设我们有两幅图像A和B,并使用特征点提取算法(如SIFT)从它们中提取出特征点和对应的描述子。
2.在进行特征点匹配时,我们得到了一个匹配对,其中包含了两个特征点:特征点A和特征点B。
queryIdx:特征点A在图像A中的索引。
trainIdx:特征点B在图像B中的索引。
换句话说,queryIdx是指示特征点在查询图像(图像A)中的位置,而trainIdx是指示特征点在训练图像(图像B)中的位置。
举个具体的例子:
假设匹配对中的queryIdx为10,trainIdx为5。
这意味着特征点A是图像A中的第11个特征点(索引从0开始),而特征点B是图像B中的第6个特征点。
在特征点匹配中,queryIdx和trainIdx提供了特征点在不同图像中的对应关系,使我们能够在不同图像间建立联系并进行后续的操作,例如计算视角变换矩阵或进行图像配准等。

二、代码示例

import cv2
import numpy as np

# 读取图像
img1 = cv2.imread('image1.jpg', 0)
img2 = cv2.imread('image2.jpg', 0)

# 创建SIFT对象并检测特征点
sift = cv2.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)

# 创建BFMatcher对象
bf = cv2.BFMatcher()

# 使用KNN算法进行特征点匹配
matches = bf.knnMatch(des1, des2, k=2)

# 通过筛选最佳匹配对获取特征点坐标
good_matches = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good_matches.append(m)

# 对匹配对按照距离进行排序
good_matches = sorted(good_matches, key=lambda x: x.distance, reverse=True)

# 获取距离最远的前十个匹配对的特征点坐标
top_matches = good_matches[:10]
points1 = np.float32([kp1[m.queryIdx].pt for m in top_matches])
points2 = np.float32([kp2[m.trainIdx].pt for m in top_matches])
#.pt是KeyPoint类的一个属性,用于表示特征点的坐标。

# 打印匹配对中特征点的坐标
for i in range(len(top_matches)):
    pt1 = tuple(map(int, points1[i]))
    pt2 = tuple(map(int, points2[i]))
    print(f"Match {i+1}: Point 1: {pt1}, Point 2: {pt2}")

输出结果:

Match 1: Point 1: (430, 79), Point 2: (170, 76)
Match 2: Point 1: (363, 56), Point 2: (100, 39)
Match 3: Point 1: (309, 225), Point 2: (29, 216)
Match 4: Point 1: (445, 3), Point 2: (181, 7)
Match 5: Point 1: (346, 77), Point 2: (80, 60)
Match 6: Point 1: (359, 94), Point 2: (100, 79)
Match 7: Point 1: (365, 80), Point 2: (106, 66)
Match 8: Point 1: (53, 53), Point 2: (298, 81)
Match 9: Point 1: (456, 363), Point 2: (168, 337)
Match 10: Point 1: (349, 110), Point 2: (84, 94)

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/m0_70484757/article/details/131510009

其他参考链接:slam十四讲ch7中,DMatch类中的queryIdx和trainIdx

posted @ 2024-07-13 22:51  rainbow70626  阅读(64)  评论(0编辑  收藏  举报