2009-07-02 9 views
5

Ich habe ein 3D-Mathematik-Problem, das ich einfach nicht lösen kann.Inverse 3D (Dreieck) Projektion

Ich habe Daten von 3 Punkten. Die Daten sind eine (2D-) Koordinate auf einer Ebene, die irgendwo im 3D-Raum schwebt. Ich kenne auch die (2D) Koordinate der Projektion. Das ergibt die folgende Reihe von Daten:

[[[x1,y1], [px1,py1], 
[[x2,y2], [px2,py2], 
[[x3,y3], [px3,py3]] 

wo die normalen (x1 etc.) Koordinaten für die Koordinaten in der Ebene stehen und die anderen (PX1 etc.) für die projizierten Koordinaten.

Was ich tun möchte, ist projizieren eine neue 2D-Koordinate ([x4, y4]).

.

Was ich bisher versucht:

Ofcourse benötigen Sie ein Auge für die Projektion, so dass ich eingestellt, dass auf [xe, ye, -1]. Die Xe und Ye sind bekannt. (Es ist ein Foto-Bezug, also habe ich das Auge gerade in die Mitte des Fotos platziert.)

Unter dem Auge habe ich die Projektionsfläche platziert (z = 0). Das gibt die folgende Projektion Koordinaten:

[[[x1,y1], [px1,py1,0], 
[[x2,y2], [px2,py2,0], 
[[x3,y3], [px3,py3,0]] 

ich das gleiche für die Koordinaten auf der Ebene nicht tun, da ich weiß nichts über diese Ebene.

Ich dachte mir auch, dass ich eine parametrisierte Formel der Linien vom Auge durch die Projektion Koordinaten machen könnte. Für Linie 1 wäre das:

Ich kenne auch den Abstand zwischen den Punkten in 3D. Das ist das Gleiche wie in 2D. Das heißt, der Abstand zwischen Punkt1 und Punkt2 wäre sqrt ((x1-x2)^2 + (y1-y2)^2).

Ich kenne auch die Entfernung zwischen den Linien (line1 und line2) zu jeder Zeit. Das ist sqrt ((line1x-line2x)^2 + (zeile1y-line2y)^2 + (line1z-line2z)^2).

Allerdings weiß ich nicht wirklich, wie man von hier aus ... Oder auch, ob dies der richtige Weg ist.

.

Ich hoffe, Sie verstehen, was ich tun können, und dass Sie mir helfen können.

Vielen Dank im Voraus!

+0

Sie sagen, dass Sie drei Punkte (xn, yn) erhalten haben, die auf eine Ebene an Punkten projiziert werden (pxn, pyn) - und Sie möchten herausfinden, wie Sie einen neuen Punkt (x4, y4) zuordnen Ebene? –

+0

Ja, mein Gott, das sage ich. Wenn ich jedoch in meiner Frage den Begriff "Ebene" verwende, meine ich die Ebene, auf der sich die Punkte (xn, yn) befinden (was meiner Meinung nach signifikant ist, wenn man den vierten Punkt abbildet). Entschuldigung für die Verwirrung. –

+0

Sie haben drei Punkte auf einer Ebene (xn, yn), die auf die Projektionsebene (pxn, pyn) projiziert werden. Dies ist auch eine zentrale (perspektivische) Projektion, so dass alle Punkte durch Strahlen von einem einzigen Punkt projiziert werden. Sie möchten wissen, wie Sie die Projektion umkehren können: Wenn Sie also einen projizierten Punkt erhalten (px4, py4), wie erhalten Sie (x4, y4)?Was ich nicht bekomme, ist, dass deine ursprünglichen Punkte überhaupt keine z-Koordinaten haben. Warum sind sie nur x/y - kennen Sie die z-Koordinate oder sind diese x/y-Koordinaten innerhalb des eigenen Koordinatensystems der Ebene ...? –

Antwort

1

Write

(x4,y4,1) = A1*(x1,y1,1) + A2*(x2,y2,1) + A3*(x3,y3,1), 

Lösung für A1, A2, A3. Dann

(xp4,yp4) = A1*(px1,py1) + A2*(px2,py2) + A3*(px3,py3). 

1. Bearbeitung.

(A1, A2, A3) ist die Lösung des linearen Systems Mat * (A1, A2, A3) = (x4, y4,1).

Dies kann auf verschiedene Arten gelöst werden. Zum Beispiel mit Cramer's Regeln.

2. Bearbeitung.

Die eingefügten 1en sind keine Z-Koordinaten, sondern homogene Erweiterungen der Eingabekoordinaten (die euklidische Koordinaten sein müssen). (A1, A2, A3) sind homogene Koordinaten in der durch die Dreiecksspitzen gebildeten Basis.

3. Bearbeitung.

Die Übereinstimmung zwischen der 3D-Ebene und der Projektionsebene ist eine projektive Transformation. Sie kann als 3x3-Matrix T definiert werden, die auf homogenen Koordinaten in der Eingabeebene (x, y, 1) (in Ihrem Koordinatensystem) arbeitet und Koordinaten (u, v, t) in der Projektionsebene erzeugt. Dann gilt px = u/t und py = v/t.

Wenn ein Punkt homogene Koordinaten (A1, A2, A3) in der Basis hat, die von drei Punkten der Eingabeebene (nicht auf derselben Linie) gebildet wird, hat seine Projektion die gleichen homogenen Koordinaten in der projizierten Basis.

Es schien mir vor 1 Stunde ziemlich klar zu sein, aber jetzt fange ich an zu zweifeln: vielleicht benötigt man ein zusätzliches Punktepaar, um eine einzige Lösung für das Problem zu haben ... Wenn Sie es finden können ein Blick auf das Buch "Algebraic Projective Geometry" von JG Semple und G.T. Kneebone.

+0

Das hört sich an, als könnte es wahr sein ... Aber wie ermittle ich A1, A2 und A3? Danke! –

+0

Ich verstehe nicht, wie Sie dieses Problem ohne ein Auge lösen können ... Die Lage des Auges würde die Projektion verändern, oder? –

+0

Wenn Sie sich in das Koordinatensystem der Ausgangsebene stellen, haben Sie die Projektionsebene verloren. Ich denke nicht, dass es so einfach gelöst werden kann. –

0

Ich verstehe das Problem nicht wirklich? Versuchen Sie, ein Objekt im 3D-Raum zu lokalisieren, von dem Sie wissen, dass es sich in einer Ebene (z. B. einer Wand oder einem Boden) befindet und nur 3 Punkte (von denen Sie die Abstände zwischen 3D-Raum kennen) ein Kamerabild?

In diesem Fall haben Sie 3 Gleichungen wie folgt, wo localCoordinates die Punkte Koordinaten im Objektraum (gibt den bekannten Abstand zwischen den Punkten) und Welt ist die Objekte Position im 3D-Raum.

Dies ergibt ein Gleichungssystem mit 6 Unbekannten (Rotation und Position in 3d) und 6 Gleichungen (2 für jeden Punkt). Es wird jedoch nicht linear sein, also müssen Sie es mit numerischen Methoden lösen. Versuchen Sie die Newton Rapson-Methode.

2

Es gibt eine Funktion Projektion, die Punkte so transformieren kann, dass Projektion ([x1, y1]) = [px1, py1], Projektion ([x2, y2]) = [px2, py2], Projektion ([x3 , y3]) = [px3, py3]. Wenn ich es richtig verstehe, möchte der Autor wissen, wie er diese Projektionsfunktion findet, damit er [x4, y4] in [px4, py4] umwandeln kann.

Da wir mit Flugzeugen hier zu tun haben, sieht die Projektionsfunktion wie folgt aus:

Proj([ix, iy]) : 
    return [ax*ix + bx*iy + cx, 
      ay*iy + by*iy + cy]; 

Mit, dass wir zwei Gleichungssysteme machen zu lösen.

Die erste
x1 * Axt + y1 * bx + cx = PX1
x2 * Axt + y2 * bx + cx = PX2
x3 * ax + y3 * bx + cx = px3

für Axt Solving, bx und cx gibt uns

ax = (px1 * (y3 - y2) - px2*y3 + px3*y2 + (px2 - px3) * y1)/
    (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1) 
bx = - (px1 * (x3 - x2) - px2*x3 + px3*x2 + (px2 - px3) * x1)/
    (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1) 
cx = (px1 * (x3*y2 - x2*y3) + x1 * (px2*y3 - px3*y2) + (px3*x2 - px2*x3) * y1)/
    (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1) 

die zweite x1 * ay + y1 * von + cy = py1
x2 * ay + y2 * von + cy = py2
x3 * ay + y3 * von + cy = py3

für ay Solving, von und cy uns

ay = (py1 * (y3 - y2) - py2*y3 + py3*y2 + (py2 - py3) * y1)/
    (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1) 
by = - (py1 * (x3 - x2) - py2*x3 + py3*x2 + (py2 - py3) * x1)/
    (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1) 
cy = (py1 * (x3*y2 - x2*y3) + x1 * (py2*y3 - py3*y2) + (py3*x2 - py2*x3) * y1)/
    (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1) 

Hinweis gibt : Ich habe this tool verwendet, um Gleichungssysteme zu lösen.

+0

Wow, danke für die ausführliche Antwort, aber ich denke, dass diese Lösung ein wenig zwielichtig ist, da die Methode, die Sie verwenden, nicht wirklich mit Projektion verbunden ist. Es gibt zum Beispiel kein Auge. Ich bezweifle daher, dass es richtig funktionieren wird ... Trotzdem werde ich es auf jeden Fall versuchen. Ich werde dich wissen lassen, ob es funktioniert hat. Vielen Dank! –

+0

Diese Lösung gibt Ihnen kein Auge oder Informationen über die Ebene des ursprünglichen Dreiecks, aber es sollte Ihr Problem lösen. –

+0

+1 für das Hervorheben eines großartigen Tools – PiotrK

0

Ein "Bit" spät hier, aber die am höchsten bewertete Antwort berücksichtigt nicht den 3D-Raum des Problems. Wir haben ein perspektivisches Projektionsproblem, bei dem drei Punkte auf einer Ebene (eigentlich alle 3 3D-Punkte) (wie in der projektiven Geometrie) auf der Oberfläche einer Kamera projiziert werden.

Es ist nicht möglich, eine eindeutige Lösung für dieses Problem zu geben (mehrere Lösungen existieren). Das generelle Problem, eine Kameraposition und -pose bei 3 3D-Punkten und deren jeweiligen 2D-Perspektivprojektionen zu finden, kann mit dem P3P (Perspective-3-Point) -Algorithmus aus dem Original RANSAC paper gelöst werden, der bis zu vier mögliche Lösungen ergibt (mit Punkte vor der Kamera).

Bei einer Kamerapose ist es trivial, die Projektion zusätzlicher Ebenenpunkte zu berechnen.