2015-06-08 64 views
9

Ich brauche die Liste der x und y Koordinaten der Pixel, die der Feature-Matcher in dem bereitgestellten Code auswählt. Ich benutze Python und OpenCV. Kann mir jemand helfen?So erhalten Sie Pixelkoordinaten von Feature-Matching in OpenCV Python

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) 

Antwort

13

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

+3

Als Sie so sehr! – kotopanda