5 Stimmen

Inverse 3D-Projektion (Dreieck)

Ich habe ein 3D-Matheproblem, das ich einfach nicht lösen kann.

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. Daraus ergibt sich das folgende Array von Daten:

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

Dabei stehen die normalen (x1 usw.) Koordinaten für die Koordinaten in der Ebene und die anderen (px1 usw.) für die projizierten Koordinaten.

Ich würde gerne eine neu 2D-Koordinate ([x4,y4]).

.

Was ich bisher ausprobiert habe:

Natürlich braucht man ein Auge für die Projektion, also habe ich das auf [xe,ye,-1] gesetzt. Die xe und ye sind bekannt. (Da es sich um eine Fotoreferenzierung handelt, habe ich das Auge einfach in die Mitte des Fotos gesetzt).

Unter dem Auge habe ich die Projektionsfläche platziert (z=0). Das ergibt die folgenden Projektionskoordinaten:

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

Das Gleiche kann ich für die Koordinaten des Flugzeugs nicht tun, da ich nichts über dieses Flugzeug weiß.

Ich dachte mir auch, dass ich eine parametrisierte Formel für die Linien erstellen könnte, die vom Auge durch die Projektionskoordinaten verlaufen. Für Linie1 wäre das:

line1x = xe+(px1-xe)*t1
line1y = ye+(py1-ye)*t1
line1z = -1+t1 // = -1+(0--1)*t1

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

Ich kenne auch den Abstand zwischen den Linien (Linie1 und Linie2) zu jedem Zeitpunkt. Das ist sqrt((line1x-line2x)^2+(line1y-line2y)^2+(line1z-line2z)^2).

Allerdings weiß ich nicht wirklich, wie es weitergehen soll... Oder ob dies überhaupt der richtige Weg ist.

.

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

Vielen Dank im Voraus!

2voto

Juozas Kontvainis Punkte 9051

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 das richtig verstehe, möchte der Autor wissen, wie er diese Projektionsfunktion finden kann, damit er [x4, y4] in [px4, py4] umformen kann.

Da wir es hier mit Ebenen zu tun haben, sieht die Funktion Projektion wie folgt aus:

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

Damit können wir 2 Gleichungssysteme aufstellen, die wir lösen müssen.

Die erste
x1 * ax + y1 * bx + cx \= px1
x2 * ax + y2 * bx + cx \= px2
x3 * ax + y3 * bx + cx \= px3

Lösen für ax , bx y 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

Lösen für ay , von y cy gibt 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)

Anmerkung: Ich habe dieses Werkzeug um Gleichungssysteme zu lösen.

1voto

Eric Bainville Punkte 9258

Schreiben Sie

(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).

      ( x1  x2  x3 )
Mat = ( y1  y2  y3 )
      (  1   1   1 )

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

2. Bearbeitung.

Die von mir 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 Basis, die durch die Eckpunkte des Dreiecks gebildet wird.

3. Bearbeitung.

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

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

Vor 1 Stunde schien es mir noch ganz klar zu sein, aber jetzt beginne ich zu zweifeln: Vielleicht muss man ein zusätzliches Punktepaar kennen, um eine einzige Lösung für das Problem zu haben... Wenn Sie es finden können, werfen Sie einen Blick in das Buch "Algebraische projektive Geometrie" von J.G. Semple und G.T. Kneebone.

1voto

fa. Punkte 2446

Sie sollten Folgendes verwenden homographische Funktionen y homogene Koordinaten die im Allgemeinen für 3D-Perspektivoperationen verwendet werden.

0voto

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

In diesem Fall haben Sie 3 Gleichungen wie diese, in denen localCoordinates die Koordinaten der Punkte im Objektraum (gibt den bekannten Abstand zwischen den Punkten) und world die Position der Objekte im 3D-Raum ist.

cameraCoordinates = world*view*projection*localCoordinates

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

0voto

digitalvision Punkte 2522

Etwas verspätet, 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 3 beliebige 3D-Punkte) auf die Oberfläche einer Kamera projiziert werden (wie in der projektiven Geometrie).

Es ist nicht möglich, eine eindeutige Lösung für dieses Problem zu finden (es gibt mehrere Lösungen). Das allgemeine Problem, eine Kameraposition und -haltung zu finden, wenn 3 3D-Punkte und ihre jeweiligen 2D-Perspektivprojektionen gegeben sind, kann mit dem P3P-Algorithmus (Perspective-3-Point) aus dem Original gelöst werden RANSAC-Papier , die bis zu vier mögliche Lösungen ergeben (mit den Punkten vor der Kamera).

Ausgehend von einer Kameraposition ist es trivial, die Projektion weiterer ebener Punkte zu berechnen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X