2016-05-26 2 views
1

Heyho!
Ich habe ein Bild von einer flachen Oberfläche (von oben und mit einem Winkel von 30 °) und ich möchte die x & y-Koordinaten eines bestimmten Pixels, aber in cm (mit dem Koordinatensystem in der Oberfläche).
Gibt es eine Methode, dies zu archivieren?
Ich benutze Python aber jede Hilfe ist willkommen! :)Berechnung der x- und y-Koordinaten in cm von den Pixelkoordinaten

Edit: Ich versuchte die Homographie-Methode von unten, aber ich schaffte es nicht leise, es zum Funktionieren zu bringen. Sie ist das, was ich getan habe:

#two sets of points I used 
#src: corners + center of my 400px*460px image 
#dst: coordinate system being outside the image 
src = np.matrix(((1, 1, 1),(400, 1, 1),(1, 460, 1),(400, 460, 1),(200,230,1))) 
dst= np.matrix(((31.6, 7, 1),(14.5, 7, 1),(28.4, 26.3, 1),(17, 26.3, 1),(22.6,18.6,1))) 

#src: random points from the image of my 400px*460px image 
#dst: coordinate system being in the actual image 
src = np.matrix(((1, 1, 1),(400, 460, 1),(200,1,1), (100, 170, 1), (280, 320, 1),(300, 50, 1))) 
dst= np.matrix(((0, 0, 1),(14.6, 19.3, 1),(17.1/2,0,1), (5.0, 9.2, 1), (11.65, 15.3, 1), (12.9, 2.9, 1))) 

H = cv2.findHomography(src,dst,0)[0] 
print (H)  
for c in range(0,5): 
    x= c*100 
    y = 1 
    print(x,y,np.dot(H,np.array((x,y,1)))) 

Actual Photo of the setup
Der Platz der Fläche sichtbar auf dem ist (400px * 460PX) Bild. Die Kamera befindet sich in der schwarzen Box rechts. Die X & Y sind meine Pixelkoordinaten.
Ergebnisse mit beiden Zahlensätzen sind gut, solange Sie auf der X-Achse bleiben. Sobald ich die Y-Achse hinunterfahre, gehen die Zahlen falsch.

+1

Dies ist ein Geometrieproblem. Sie müssen zwei Dinge wissen - die Projektionsmatrix der Kamera (kalkulierbar durch die Messung des Gesichtsfeldes) und die Transformationsmatrix der Kamera (ihre Position relativ zur Tabelle). – Eric

+0

Alternativ können Sie auch eine OpenCV-Kamera-Kalibrierungsroutine verwenden und sich den Aufwand für die Messung sparen – Eric

+0

Die Informationen, die Sie in Ihrer Frage angeben, sind wirklich nicht genug, um Ihr Problem zu lösen. Wenn Sie nichts über die intrinsischen Parameter Ihrer Kamera wissen, gibt es keine Chance, die richtige Lösung zu finden. Denken Sie nur daran, dass Ihre flache Oberfläche entweder eine sehr kleine Oberfläche sein könnte, die von sehr nah betrachtet wird, oder eine sehr große, die von weit her gesehen wird. – Sunreef

Antwort

1

Ein Ansatz besteht darin, die Homographie zwischen der Ebene Ihrer flachen Oberfläche und Ihrer Bildebene zu schätzen. Eine einfache Methode zur Schätzung der Homographie:

  1. erhalten Sie die Koordinaten in cm von vier (nicht kollinearen) Punkten auf Ihrer flachen Oberfläche;
  2. finden Sie die gleichen vier Punkte im Bild und erhalten ihre Koordinaten in Pixel;
  3. schätzen Sie die Homographie mit cv::findHomography;
  4. finden Sie im Bild Ihren Punkt von Interesse und erhalten Sie seine Koordinaten in Pixel;
  5. berechnen Sie die Koordinate Ihres Punktes in cm mit der Homographie.

Für eine arbeitet Probe in C++ mit OpenCV siehe meine Antwort https://stackoverflow.com/a/36388035/15485

Wenn Sie mehr Genauigkeit müssen auch für die Verzerrung der Linse zu kompensieren Sie brauchen, und da Sie sagen, Sie haben eine Himbeere pi Kamera vielleicht die Verzerrung ist nicht vernachlässigbar ... aber es hängt von der Genauigkeit ab, die Sie benötigen. Die Homographie ist nicht in der Lage, die Verzerrung zu kompensieren.

+0

Hallo Alessandro! Danke für Ihre Antwort! Ich habe versucht, dies den ganzen Tag zu arbeiten, aber gescheitert :( Ich nahm vier Punkte und bekam ihre Pixel und cm-Koordinaten. Berechnete H mit cv2.findHomography (src (PixelCoords), dst (cmCoords), 0). Und für meinen Punkt von Interesse berechnete ich P (in cm) = H * p (in Pixel). Allerdings funktioniert das bei mir nur auf einer bestimmten Zeile (mit y (Pixel) = 0) und alle anderen Werte sind weit weg. Danke für deine Hilfe im Voraus! – ShixX

+0

@ShixX Ich denke, dass, um Hilfe von der StackOverflow-Community zu bekommen, das Beste, was Sie tun können, ist Ihre Frage zu bearbeiten, den Code, den Sie versuchten, und wenn möglich das Bild. –

Verwandte Themen