2012-09-20 119 views
10

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

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

但是,当我尝试使用描述符(DESC1,DESC2)使用knnMatch,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?它是一个错误吗?

回答

10

我使用的是正确的数据类型与所述功能np.asarray()

raw_matches=matcher.knnMatch(np.asarray(desc1,np.float32),np.asarray(desc2,np.float32), 2) #2 
+0

错误消失了,但它找不到任何东西。 –

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,我记得我也有问题。

如果没有帮助,我会看看我明天能否找到我的解决方案。

+0

我使用IDX2 = cv2.flann_Index()idx2.build(NP具有相同的错误,但在这种情况下解决了这个问题。 asarray(desc2),flann_params) 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_ – Sergio

+0

您是否尝试过我在我的答案中发布的代码?它为我工作。恐怕我不太了解你的评论? – casper

+0

是的,我正在使用OpenCV-2.4.2。当我尝试你的代码cv2.flann_Index(desc2,flann_params)抛出一个关于没有模块的异常。我读到,你需要编码以下功能:idx2 = cv2.flann_Index()idx2.build(np.asarray(desc2),flann_params) – Sergio