2016-04-24 18 views
1

Ich benutze die Sift-Implementierung zusammen mit Code in der "Programming Computer Vision with Python" gefunden.Python: Sift Punkte zeichnen gibt Punkte von den Bildern zurück

Während der plotMatches Funktion in vision.py (äquivalent zu dem plot_matches() Funktion zum Buch) verwenden, einige der eingezeichneten Punkte sind nicht einmal auf dem Bild: Output of the results

Wie Sie sehen können, die meisten Punkte sind nicht auf dem Bild.

Dies ist das Ergebnis einer Änderung kann ich meine plotMatches machen musste() Funktion:

 for i, m in enumerate(matchscores): 
      if i > 0: 
       lab.plot([locs1[i][1], locs2[i][1] + cols1], 
       [locs1[i][0], locs2[i][0]], 'c') 

Der ursprüngliche Code:

 for i, m in enumerate(matchscores): 
      if i > 0: 
       lab.plot([locs1[i][1], locs2[m][1] + cols1], 
       [locs1[i][0], locs2[m][0]], 'c') 

den folgenden Fehler werfen würde:

Traceback (most recent call last): 
    File "/home/peter-brown/AI/Markus/ImageRecognition.py", line 37,  in <module> 
    sch.plotMatches(image, image2, l1, l2, matches, show_below=False) 
    File "/home/peter-brown/AI/Markus/vision.py", line 199, in plotMatches 
    lab.plot([locs1[i][1], locs2[m][1] + cols1], 
    IndexError: index 1 is out of bounds for axis 0 with size 1 

Durch die Änderung eines 'm' im Code, das Programm würde funktionieren, aber es würde falsch ausgeben.

Warum stimmt die Ausgabe nicht mit dem Bild überein und wie kann ich die Funktion plotMatches ändern?

Antwort

1

In matplotlib werden die Koordinaten x und y gewendet. Von Ihrem Bild sieht es so aus, als würden Sie alle x Koordinaten als y Koordinaten interpretieren und umgekehrt. Von Ihrer Funktion aus ist dies eine einfache Änderung:

for i, m in enumerate(matchscores): 
     if i > 0: 
      lab.plot([locs1[i][0], locs2[i][0] + cols1], 
      [locs1[i][1], locs2[i][1]], 'c')