Wir wissen, dass Ihre keypoints in kp1
gespeichert sind und kp2
, wo sie sind die Merkmale für das erste und zweite Bild übereinstimmt sind. In der Perspektive cv2.ORB
sind dies 2D-Matrizen, wobei jede Zeile ein Schlüsselpunkt ist, der in dem ersten Bild kp1
und dem zweiten Bild kp2
erkannt wird.
In Ihrem Fall, weil Sie cv2.BFMatch
verwenden, matches
gibt eine Liste von cv2.DMatch
Objekte, bei denen jedes Objekt mehrere Elemente enthält .... darunter sind zwei wichtige Mitglieder:
queryIdx
- Der Index oder Reihe der kp1
Interessenpunkt-Matrix, die
trainIdx
entspricht - der Index oder Zeile der kp2
Interessenpunkt-Matrix, die einstimmt Daher
, queryIdx
und trainIdx
Ihnen sagen, welche ORB Spiel zwischen kp1
und kp2
verfügt. Daher würden Sie diese verwenden, um in kp1
und kp2
zu indizieren und das Element pt
zu erhalten, das ein Tupel von (x,y)
Koordinaten ist, die die tatsächlichen räumlichen Koordinaten der Übereinstimmungen bestimmen.
Alles, was Sie tun müssen, ist in matches
, hängen Sie an eine Liste von Koordinaten für beide kp1
und kp2
und fertig durch jedes cv2.DMatch
Objekt iterieren.
Etwas wie folgt aus:
# Initialize lists
list_kp1 = []
list_kp2 = []
# For each match...
for mat in matches:
# Get the matching keypoints for each of the images
img1_idx = mat.queryIdx
img2_idx = mat.trainIdx
# x - columns
# y - rows
# Get the coordinates
(x1,y1) = kp1[img1_idx].pt
(x2,y2) = kp2[img2_idx].pt
# Append to each list
list_kp1.append((x1, y1))
list_kp2.append((x2, y2))
Bitte beachte, dass ich nur list_kp1.append(kp1[img1_idx].pt)
und das gleiche für list_kp2
getan haben könnte, aber ich wollte es ganz klar darüber treffen, wie die räumlichen Koordinaten zu interpretieren. Sie könnten auch einen Schritt weiter gehen und eine Liste Verständnis tun:
list_kp1 = [kp1[mat.queryIdx].pt for mat in matches]
list_kp2 = [kp2[mat.trainIdx].pt for mat in matches]
list_kp1
werden die räumlichen Koordinaten eines Merkmalspunkts enthalten, die mit der entsprechenden Position in list_kp2
abgestimmt. Mit anderen Worten enthält das Element i
von list_kp1
die Raumkoordinaten des Merkmalspunkts von img1
, der mit dem entsprechenden Merkmalspunkt aus img2
in list_kp2
übereinstimmt, dessen räumliche Koordinaten in Element i
sind.
Als kleinere Bemerkung am Rande, ich dieses Konzept verwendet, wenn ich eine Abhilfe für drawMatches
weil für OpenCV 2.4.x schrieb, der Python-Wrapper auf die C++ Funktion nicht existiert, so habe ich die Verwendung des obigen Konzepts in Lokalisieren der räumlichen Koordinaten der übereinstimmenden Merkmale zwischen den zwei Bildern, um meine eigene Implementierung davon zu schreiben.
Probieren Sie es aus, wenn Sie möchten!
module' object has no attribute 'drawMatches' opencv python
Als Sie so sehr! – kotopanda