使用OpenCV密集SIFT查找图像匹配

1 投票
1 回答
3191 浏览
提问于 2025-04-18 01:48

我用OpenCV实现了一个密集特征检测器,参考了这个问题中的一个回答。

sift = cv2.SIFT()
dense=cv2.FeatureDetector_create("Dense")
kp1=dense.detect(template_detect)
des1=sift.compute(template_detect,kp1)
kp2=dense.detect(image_detect)
des2=sift.compute(image_detect,kp2)

它运行得很好,不过我想比较这两张图片,看看能不能找到它们之间的匹配点。但是当我尝试像下面这样实现时,出现了一个错误:“TypeError: queryDescriptors is not a numerical tuple”。

bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True)
matches = bf.match(des1,des2)
matches = sorted(matches, key = lambda x:x.distance)
img3 = cv2.drawMatches(template_detect,kp1,image_detect,kp2,matches[:4], 2, None)

有没有更好的方法可以用来实现这两张图片之间的关键点匹配呢?

1 个回答

1

你可能已经不再关注这个问题了,但错误在于 compute() 的用法 是这样的:

Python: cv2.SIFT.compute(image, keypoints[, descriptors]) → keypoints, descriptors

你的代码把 des1 和 des2 赋值为一个包含关键点和描述符的元组,这样是不对的。你需要修改你的代码;

sift = cv2.SIFT()
dense=cv2.FeatureDetector_create("Dense")
kp1=dense.detect(template_detect)
_, des1=sift.compute(template_detect,kp1)
kp2=dense.detect(image_detect)
_, des2=sift.compute(image_detect,kp2)

这样做会把关键点从返回值中去掉。

撰写回答