2012-09-20 83 views
10

Python + OpenCVを使用して2枚の画像をマッチングしたいと思います。私は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) #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を使用することができます方法:

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

例外は、次のでしょうか?それはバグですか?

答えて

10

IはIDX2 = cv2.flann_Index()idx2.build(NPを使用して、私は同じ間違いを有する

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

エラーは消えましたが、何も見つかりませんでした。 –

0

this questionへの回答を参照してください。

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])) 

は記述子を返します。ここ

答えはEsteban Angeeさんから、関連するコードです該当するもの:

return pairs[mask] 

私は自分のワークステーションにいませんので、私はあなたのコードに何が間違っているかを見ることはできませんが、上記の問題は同じ問題があったときのすべてのトラブルを解決しました。 FlannBasedMatcherを使用する必要はありません、私もそれに問題があったことを覚えています。

もし役に立たなかったら、私は明日のように私の解決策を見つけることができるかどうかを見ていきます。

+0

)(関数np.asarrayで正しいデータ型を使用してこの問題を解決したが、この場合です。 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 :エラー:(-210)type = 6 function in 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

関連する問題