So erhalten Sie Pixelkoordinaten aus der Feature-Anpassung in OpenCV Python

9

Ich brauche die Liste der Koordinaten x und y der Pixel, die der Feature Matcher im angegebenen Code auswählt. Ich benutze Python und OpenCV. Kann mir jemand helfen?

%Vor%     
kotopanda 08.06.2015, 18:36
quelle

1 Antwort

14

Wir wissen, dass Ihre Schlüsselpunkte in kp1 und kp2 gespeichert sind, wo sie die Übereinstimmungen für das erste bzw. zweite Bild darstellen. In der Perspektive cv2.ORB handelt es sich um 2D-Matrizen, bei denen jede Zeile ein Schlüsselpunkt ist, der im ersten Bild kp1 und im zweiten Bild kp2 erkannt wird.

In Ihrem Fall, weil Sie cv2.BFMatch verwenden, gibt matches eine Liste von cv2.DMatch -Objekten zurück, wobei jedes Objekt mehrere Mitglieder enthält .... darunter sind zwei wichtige Mitglieder:

  • queryIdx - Der Index oder die Zeile der kp1 Interessenpunktmatrix, die mit
  • übereinstimmt
  • trainIdx - Der Index oder die Zeile der kp2 Interessenpunktmatrix, die mit
  • übereinstimmt

Daher sagen Ihnen queryIdx und trainIdx , welche ORB-Funktionen zwischen kp1 und kp2 übereinstimmen. Daher würden Sie diese verwenden, um in kp1 und kp2 zu indizieren und das pt -Member zu erhalten, das ein Tupel von (x,y) -Koordinaten ist, die die tatsächlichen räumlichen Koordinaten der Treffer bestimmen.

Alles, was Sie tun müssen, ist, jedes cv2.DMatch -Objekt in matches zu durchlaufen, an eine Liste von Koordinaten für kp1 und kp2 anzuhängen und Sie sind fertig.

In etwa so:

%Vor%

Beachten Sie, dass ich einfach list_kp1.append(kp1[img1_idx].pt) und dasselbe für list_kp2 hätte machen können, aber ich wollte klarstellen, wie die räumlichen Koordinaten zu interpretieren sind. Sie könnten auch einen Schritt weiter gehen und ein Listenverständnis machen:

%Vor%

list_kp1 enthält die räumlichen Koordinaten eines Feature-Punktes, der mit der entsprechenden Position in list_kp2 übereinstimmt. Mit anderen Worten: Das Element i von list_kp1 enthält die räumlichen Koordinaten des Merkmalspunkts von img1 , die mit dem entsprechenden Merkmalspunkt aus img2 in list_kp2 übereinstimmten, deren räumliche Koordinaten im Element i sind.

Als kleine Randbemerkung habe ich dieses Konzept verwendet, als ich einen Workaround für drawMatches Weil für OpenCV 2.4.x der Python-Wrapper für die C ++ - Funktion nicht existiert, habe ich das obige Konzept benutzt, um die räumlichen Koordinaten der übereinstimmenden Features zwischen den beiden Bildern zu finden, um meine eigene Implementierung davon zu schreiben.

Schau es dir an, wenn du willst!

Modul 'Objekt hat kein Attribut' drawMatches ' opencv python

    
rayryeng 08.06.2015, 22:51
quelle