使用OpenCV密集SIFT查找图像匹配
我用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)
这样做会把关键点从返回值中去掉。