Wie man die pixel-Koordinaten von Feature-Matching in Python-OpenCV
Ich brauche, um die Liste der x
und y
Koordinaten der Pixel, die die Funktion matcher wählt im code zur Verfügung gestellt. Ich bin mit Python und OpenCV. Kann mir jemand helfen?
img1=cv2.imread('DSC_0216.jpg',0)
img2=cv2.imread('DSC_0217.jpg',0)
orb=cv2.ORB(nfeatures=100000)
kp1,des1=orb.detectAndCompute(img1,None)
kp2,des2=orb.detectAndCompute(img2,None)
img1kp=cv2.drawKeypoints(img1,kp1,color=(0,255,0),flags=0)
img2kp=cv2.drawKeypoints(img2,kp2,color=(0,255,0),flags=0)
cv2.imwrite('m_img1.jpg',img1kp)
cv2.imwrite('m_img2.jpg',img2kp)
bf=cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches=bf.match(des1,des2)
matches=sorted(matches, key= lambda x:x.distance)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wir wissen, dass Ihre Eckdaten sind gespeichert in
kp1
undkp2
wo Sie sind die Funktionen, Spiele für das erste und zweite Bild jeweils. In dercv2.ORB
Perspektive, diese sind 2D-Matrizen auf, wo jede Zeile ist ein Schlüsselpunkt, dass erkannt wird, im ersten Bild,kp1
und das zweite Bildkp2
.In Ihrem Fall, weil Sie mit
cv2.BFMatch
,matches
gibt eine Liste voncv2.DMatch
- Objekte, wobei jedes Objekt enthält mehrere Elemente.... unter Ihnen sind zwei wichtige Mitglieder:queryIdx
- Index oder Zeile derkp1
Interesse Punkt matrix entsprichttrainIdx
- Index oder Zeile derkp2
Interesse Punkt matrix entsprichtDaher
queryIdx
undtrainIdx
Ihnen sagen, welche ORB-features-match zwischenkp1
undkp2
. Daher sollten Sie diese verwenden, um einen index inkp1
undkp2
und erhalten diept
Mitglied, ist ein Tupel von(x,y)
Koordinaten, die Ermittlung der tatsächlichen räumlichen Koordinaten des matches.Alles, was Sie tun müssen ist, Durchlaufen die einzelnen
cv2.DMatch
Objekt inmatches
, "anfügen", um eine Liste von Koordinaten für beidekp1
undkp2
und du bist fertig.Etwas wie dieses:
Hinweis, das hätte ich gerade getan
list_kp1.append(kp1[img1_idx].pt)
und das gleiche fürlist_kp2
, aber ich wollte sehr deutlich machen, wie zu interpretieren die räumlichen Koordinaten. Man könnte auch einen Schritt weiter gehen und eine Liste Verständnis:list_kp1
enthält die Geo-Koordinaten des feature-Punktes, die abgestimmt mit der entsprechenden position inlist_kp2
. In anderen Worten, elementi
vonlist_kp1
enthält die Geo-Koordinaten des feature-Punktes ausimg1
, die abgestimmt mit der entsprechenden Funktion Punkt ausimg2
imlist_kp2
deren räumliche Koordinaten im elementi
.Als kleine sidenote, ich benutzte dieses Konzept, wenn ich schrieb einen workaround für
drawMatches
, weil für OpenCV 2.4.x, der Python-wrapper um die C++ - Funktion existiert nicht, also ich habe das obige Konzept bei der Suche nach den Geo-Koordinaten der übereinstimmenden Merkmale zwischen den beiden Bildern zu schreiben, meine eigenen Durchführung.Check it out, wenn Sie möchten!
Modul' - Objekt hat kein Attribut 'drawMatches' opencv python