OpenCV和Python:knnMatch参数问题
我正在尝试按照这个 opencv教程 来学习。可惜的是,在执行 flann.knnMatch(des1,des2,k=2) 的时候出错了。以下是我的代码:
import cv2
import time
import numpy as np
im1 = cv2.imread('61_a.tif')
im2 = cv2.imread('61_b.tif')
surf = cv2.SURF(500,3,4,1,0)
print "Detect and Compute"
kp1 = surf.detect(im1,None)
kp2 = surf.detect(im2,None)
des1 = surf.compute(im1,kp1)
des2 = surf.compute(im2,kp2)
MIN_MATCH_COUNT = 5
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks = 50)
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1,des2,k=2)
我遇到了这个错误:
matches = matcher.knnMatch(des1,des2,k=2)
TypeError: Argument given by name ('k') and position (2)
我尝试按照这个 问题中的解决方案 来修改匹配方式,像这样:
flann = cv2.flann_Index(des2, index_params)
matches = flann.knnMatch(des1,2,params={})
但是我又遇到了这个错误:
flann = cv2.flann_Index(des2, index_params)
TypeError: features is not a numerical tuple
我真的不太确定我哪里做错了。有没有人能给我指个方向?
如果你知道有一个简单易懂的关于使用PYTHON进行全景拼接的SURF或ORB的例子,我也会很感激。我在网上搜索了很多,只找到了一些关于如何实现的片段(或者是用C语言写的),或者只找到了一些未完成或有问题的例子。
谢谢!
1 个回答
1
surf.compute()
这个函数会返回两个列表,一个是关键点列表,另一个是描述符列表。然后,flann.knnMatch()
这个函数会感到困惑,因为 des1
是一对列表,而不是简单的一个列表,所以它在寻找匹配时,发现了另一对列表(也就是 des2
)。你可以检查一下 des1
和 des2
的形状(shape)。
你可以把 des1[1]
和 des2[1]
传给 flann.knnMatch()
,或者用 surf.detectAndCompute()
来替代 surf.detect()
和 surf.compute()
这两个函数。