2012-09-20 7 views
10

ich zwei Bilder mit Python + OpenCV übereinstimmen soll. Ich habe SURF verwendet, um Schlüsselpunkte und Deskriptoren von beiden zu extrahieren. Jetzt muss ich diese Deskriptoren anpassen und aus diesem Grund entschied ich mich für Flann Matcher.Fehler mit knnMatch mit OpenCV + Python

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

Aber wenn ich versuche, mit Deskriptoren zu verwenden knnMatch (desc1, desc2), wirft OpenCV eine Ausnahme.

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

Die Ausnahme ist folgende:

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_ 

Wie ich knnMatch richtig verwenden könnte? Ist es ein Fehler?

Antwort

10

Ich löste dieses Problem, den richtigen Datentyp mit der Funktion np.asarray mit()

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

Der Fehler ging weg, aber es kann nichts finden. –

0

Siehe die Antwort auf this question.

ist hier der entsprechende Code, aus Esteban Angee ‚s Antwort:

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

Wörterbuch Construct Ihre Parameter:

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

nächsten Nachbarn zu suchen Perform:

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

Gibt die Deskriptoren das übereinstimmte:

return pairs[mask] 

Ich bin gerade nicht an meinem Arbeitsplatz, also habe ich Angst, ich kann nicht sehen, was mit Ihrem Code nicht stimmt, aber die obige Frage löste alle meine Probleme, wenn ich das gleiche Problem hatte. Sie müssen FlannBasedMatcher nicht verwenden, ich erinnere mich, dass ich auch Probleme damit hatte.

Wenn es nicht hilft, werde ich sehen, ob ich meine Lösung morgen oder so finden.

+0

ich den gleichen Fehler haben, aber in diesem Fall idx2 = cv2.flann_Index() idx2.build (np verwenden. 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 : Fehler: (-210) type = 6 in Funktion buildIndex_ – Sergio

+0

Haben Sie versucht, den Code, den ich in meiner Antwort geschrieben? Es hat für mich funktioniert. Ich fürchte, ich verstehe deinen Kommentar nicht wirklich. – casper

+0

Ja, ich verwende OpenCV-2.4.2. Als ich deinen Code ausprobiert habe cv2.flann_Index (desc2, flann_params) eine Ausnahme über kein Modul geworfen. Ich habe gelesen, dass Sie die folgenden Funktionen codieren müssen: idx2 = cv2.flann_Index() idx2.build (np.asarray (desc2), flann_params) – Sergio