使用knnMatch与OpenCV + Python时出错

时间:2012-09-20 08:37:32

标签: python opencv runtime-error

我想使用Python + OpenCV匹配两张图片。我使用SURF从两者中提取关键点和描述符。现在,我需要匹配这些描述符,因此我决定使用Flann Matcher。

flann_params = dict(algorithm = FLANN_INDEX_KDTREE,trees = 4)    
matcher = cv2.FlannBasedMatcher(flann_params, {})

但是当我尝试将knnMatch与描述符(desc1,desc2)一起使用时,openCV会抛出异常。

raw_matches=matcher.knnMatch(np.asarray(desc1),np.asarray(desc2), 2)

例外情况如下:

raw_matches=matcher.knnMatch(np.asarray(desc1),np.asarray(desc2), 2) #2
cv2.error: /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_graphics_opencv/opencv/work/OpenCV-2.4.2/modules/flann/src/miniflann.cpp:299: error: (-210) type=6
 in function buildIndex_

如何正确使用knnMatch?这是一个Bug吗?

2 个答案:

答案 0 :(得分:11)

我使用函数np.asarray()

使用正确的数据类型解决了这个问题
raw_matches=matcher.knnMatch(np.asarray(desc1,np.float32),np.asarray(desc2,np.float32), 2) #2

答案 1 :(得分:0)

请参阅this question的答案。

以下是相关代码,来自Esteban Angee的答案:

r_threshold = 0.6
FLANN_INDEX_KDTREE = 1  # bug: flann enums are missing

构建参数字典:

flann_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 4)
flann = cv2.flann_Index(desc2, flann_params)

执行最近邻搜索:

idx2, dist = flann.knnSearch(desc1, 2, params = {}) # bug: need to provide empty dict
mask = dist[:,0] / dist[:,1] < r_threshold
idx1 = np.arange(len(desc1))
pairs = np.int32( zip(idx1, idx2[:,0]) )

返回匹配的描述符:

return pairs[mask]

我现在不在我的工作站,所以我担心我不能看你的代码有什么问题,但是当我遇到同样的问题时,上面的问题解决了我所有的麻烦。您不必使用FlannBasedMatcher,我记得我也遇到过问题。

如果没有帮助,我会明白是否能在明天左右找到我的解决方案。