Wie man den Deskriptor-Abgleich mit dem opencv-Modul in Python visualisiert

8

Ich versuche, opencv mit Python zu verwenden. Ich schrieb einen Deskriptor (SIFT, SURF oder ORB) passender Code in C ++ Version von opencv 2.4. Ich möchte diesen Code mit Python in opencv konvertieren. Ich habe einige Dokumente darüber gefunden, wie opencv-Funktionen in C ++ verwendet werden, aber viele der opencv-Funktionen in Python konnten ich nicht finden, wie man sie benutzt. Hier ist mein Python-Code, und mein aktuelles Problem ist, dass ich nicht weiß, wie man "drawMatches" von opencv c ++ in Python verwendet. Ich habe cv2.DRAW_MATCHES_FLAGS_DEFAULT gefunden, aber ich weiß nicht, wie ich es benutzen soll. Hier ist mein Python-Code der Übereinstimmung mit ORB-Deskriptoren:

%Vor%

Fehlermeldung der Zeile "img_matches = cv2.DRAW_MATCHES_FLAGS_DEFAULT (im2, keypoints2, im4, keypoints4, raw_matches)"

%Vor%

Ich habe viel Zeit mit der Suche nach Dokumentation und Beispielen für die Verwendung von opencv-Funktionen mit Python verbracht. Ich bin jedoch sehr frustriert, da es sehr wenig Informationen über die Verwendung von opencv-Funktionen in Python gibt. Es wird sehr hilfreich sein, wenn mir jemand beibringen kann, wo ich die Dokumentation finde, wie man jede Funktion des opencv-Moduls in Python benutzt. Ich schätze Ihre Zeit und Hilfe.

    
user1433201 20.06.2012, 06:57
quelle

3 Antworten

14

Sie können den Feature-Abgleich in Python wie folgt visualisieren. Beachten Sie die Verwendung von SCIPY-Bibliothek.

%Vor%     
wall-e 28.12.2012 12:27
quelle
9

Ich habe auch selbst etwas geschrieben, das nur die OpenCV-Python-Schnittstelle benutzt und ich habe scipy nicht benutzt. drawMatches ist Teil von OpenCV 3.0.0 und gehört nicht zu OpenCV 2, was ich gerade verwende. Auch wenn ich zu spät zur Party komme, hier ist meine eigene Implementierung, die drawMatches nach besten Kräften nachahmt.

Ich habe meine eigenen Bilder zur Verfügung gestellt, wo einer von einem Kameramann ist, und der andere ist das gleiche Bild, aber um 55 Grad gegen den Uhrzeigersinn gedreht.

Die grundlegende Prämisse von dem, was ich geschrieben habe, ist, dass ich ein RGB-Ausgabebild zuteile, wobei die Anzahl der Zeilen das Maximum der zwei Bilder ist, um beide Bilder in das Ausgabebild zu bringen und die Spalten sind einfach die Summe von beide Spalten zusammen. Ich platziere jedes Bild an den entsprechenden Stellen und führe dann eine Schleife mit allen übereinstimmenden Schlüsselpunkten durch. Ich extrahiere, welche Schlüsselpunkte zwischen den beiden Bildern übereinstimmen und extrahiere dann ihre (x,y) -Koordinaten. Ich zeichne dann Kreise an jedem der erkannten Stellen und zeichne dann eine Linie, die diese Kreise verbindet.

Bedenken Sie, dass der erkannte Schlüsselpunkt im zweiten Bild in Bezug auf sein eigenes Koordinatensystem ist. Wenn Sie dies in das endgültige Ausgabebild einfügen möchten, müssen Sie die Spaltenkoordinate um die Anzahl der Spalten aus dem ersten Bild versetzen, so dass die Spaltenkoordinate in Bezug auf das Koordinatensystem des Ausgabebilds ist .

Ohne weitere Umschweife:

%Vor%

Um zu zeigen, dass das funktioniert, hier sind die zwei Bilder, die ich verwendet habe:

Ich benutzte OpenCVs ORB-Detektor, um die Schlüsselpunkte zu erkennen, und benutzte die normalisierte Hamming-Distanz als Abstandsmaß für die Ähnlichkeit, da dies ein binärer Deskriptor ist. Als solche:

%Vor%

Das ist das Bild, das ich bekomme:

    
rayryeng 07.10.2014 15:59
quelle
2

Wie die Fehlermeldung besagt, ist DRAW_MATCHES_FLAGS_DEFAULT vom Typ 'long'. Es ist eine durch das cv2-Modul definierte Konstante, keine Funktion. Leider existiert die gewünschte Funktion 'drawMatches' nur in der C ++ - Schnittstelle von OpenCV.

    
Anonymous 02.07.2012 06:48
quelle