2012-09-20 207 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