2008-09-25 13 views
16

Ich habe 3 Punkte in einem 3D-Raum, von denen ich die genauen Standorte kenne. Angenommen, sie sind: (x0,y0,z0), (x1,y1,z1) und (x2,y2,z2).3d zu 2d Projektion Matrix

Auch ich habe eine Kamera, die diese 3 Punkte betrachtet und ich kenne die 2D-Positionen dieser drei Punkte in der Kameraansichtsebene. So wird zum Beispiel (x0,y0,z0) wird (x0',y0'), und (x1,y1,z1) werden (x1',y1') und (x2,y2,z2) wird (x2',y2') aus der Sicht der Kamera sein.

Was ist der einfachste Weg, um die Projektionsmatrix zu finden, die diese 3D-Punkte in 2D-Punkte auf der Kamera-Ansichtsebene projiziert. Wir wissen nichts über den Standort der Kamera.

+0

Dies ist nicht meine Hausaufgaben! –

Antwort

12

Dies gibt Ihnen zwei Sätze, die jeweils von drei Gleichungen in drei Variablen:

a*x0+b*y0+c*z0 = x0' 
a*x1+b*y1+c*z1 = x1' 
a*x2+b*y2+c*z2 = x2' 

d*x0+e*y0+f*z0 = y0' 
d*x1+e*y1+f*z1 = y1' 
d*x2+e*y2+f*z2 = y2' 

Verwenden Sie einfach, was Methode zur Lösung simultane Gleichungen ist am einfachsten in Ihrer Situation (es nicht einmal schwierig ist, diese zu lösen „durch Hand"). Dann ist Ihre Transformationsmatrix einfach ((a, b, c) (d, e, f)).

...

Eigentlich, das ist zu stark vereinfachte und nimmt eine Kamera am Ursprung des 3D-Koordinatensystem und keine Perspektive hingewiesen.

Für Perspektive arbeitet die Transformationsmatrix mehr wie:

   (a, b, c, d) (xt) 
(x, y, z, 1) (e, f, g, h) = (yt) 
       (i, j, k, l) (zt) 

(xv, yv) = (xc+s*xt/zt, yc+s*yt/zt) if md < zt; 

aber die 4x3-Matrix ist mehr eingeschränkt als 12 Freiheitsgrade, da wir

a*a+b*b+c*c = e*e+f*f+g*g = i*i+j*j+k*k = 1 
a*a+e*e+i*i = b*b+f*f+j*j = c*c+g*g+k*k = 1 

So sollten Sie wahrscheinlich 4 haben sollte Punkte, um 8 Gleichungen zu erhalten, um die 6 Variablen für Kameraposition und -winkel und 1 mehr für die Skalierung der 2D-Ansichtspunkte abzudecken, da wir in der Lage sein werden, die "Mittelpunkt" -Koordinaten (xc, yc) zu eliminieren.

Wenn Sie also 4 Punkte haben und Ihre 2-D-Ansichtspunkte relativ zur Mitte Ihrer Anzeige transformieren, können Sie 14 simultane Gleichungen in 13 Variablen erhalten und lösen.

Leider sind sechs der Gleichungen keine linearen Gleichungen. Glücklicherweise sind alle Variablen in diesen Gleichungen auf die Werte zwischen -1 und 1 beschränkt, so dass es immer noch wahrscheinlich ist, die Gleichungen zu lösen.

+0

Ihre Lösung war wahrscheinlich die beste Antwort auf mein Problem. Beschreiben Sie bitte etwas mehr über den zweiten Teil der Lösung. Was ist xv und yv auch md und zt und xt yt zt. Vielen Dank –

0

Ich glaube nicht, dass es genug Informationen gibt, um eine endgültige Lösung zu finden. Ohne den Standort Ihrer Kamera zu kennen und ohne Ihre Ansichtsebene zu kennen, gibt es unendlich viele Matrizen, die dieses Problem lösen können.

+0

Nein, er meint, dass es eine unendliche Anzahl von Matrizen gibt, die das tun, was Sie für eine bestimmte Menge von Punkten verlangen. Sie benötigen entweder mehr Punkte oder weniger Freiheit (z. B. Fixieren des Blickfelds der Kamera), um dies zu beheben. –

+0

Wie viele Punkte brauche ich? –

+1

Wenn Sie die Kameraansichtsebene (die Z-Entfernung von der Kamera) kennen, können Sie anhand der Punkte die Position der Kamera ermitteln, da es sich nur um den Schnittpunkt der drei Linien handelt. Von dort denke ich, dass die Achsen der Matrix möglicherweise berechnet werden können. –

3

Ihre Kamera hat (mindestens) 7 Freiheitsgrade - 3 für Position, 3 für Ausrichtung und 1 für FOV. Ich bin mir sicher, dass mich jemand korrigieren wird, wenn ich falsch liege, aber es scheint nicht so, als würden 3 Punkte für eine vollständige Lösung reichen.

Eine allgemeine Lösung für dieses Problem finden Sie unter "Grafikkorrelation anzeigen" in Graphics Gems II.

+0

7 ist normalerweise korrekt, obwohl einige Systeme zwei Parameter für das FOV zulassen: vertikal und horizontal. Normalerweise sind sie zueinander proportional (d. H. Ein 4: 3 Bildschirm = 4: 3 FOV Verhältnis), aber in einigen Fällen kann dies verzerrt werden, wenn der Benutzer dies wünscht. –

2

Was Sie suchen, ist eine Pose Estimation Algorithmus. Sehen Sie sich die POSIT-Implementierung in OpenCV an: http://opencv.willowgarage.com/documentation/c/calib3d_camera_calibration_and_3d_reconstruction.html#posit

Sie benötigen vier oder mehr Punkte und dürfen nicht in derselben Ebene liegen.Ein Tutorial für diese Implementierung

ist hier: http://opencv.willowgarage.com/wiki/Posit

Do darauf achten, obwohl: im Tutorial ein Quadrat Ansichtsfenster verwendet wird, so dass alle View-Koordinaten sind in den -1, -1 bis 1,1 Bereich . Dies führt zu der Annahme, dass diese im Kamerakoordinatensystem liegen sollten (vor der Korrektur des Seitenverhältnisses). Dies ist nicht der Fall. Wenn Sie also ein Ansichtsfenster mit z. Bei einem Seitenverhältnis von 4: 3 sollten die Eingabekoordinaten im Bereich -1.3333, -1 bis 1.3333,1 liegen.

Übrigens, wenn Ihre Punkte in der gleichen Ebene liegen müssen, dann können Sie auch den CameraCalibration-Algorithmus von OpenCV betrachten, aber dies ist aufwendiger einzurichten und erfordert mehr Punkte als Eingabe. Sie erhalten jedoch auch die Verzerrungsinformationen und die intrinsischen Parameter Ihrer Kamera.