Konvertieren eines 2D-Bildes zeigen Sie auf eine 3D-Welt zeigen
Ich weiß, dass im Allgemeinen Fall, wodurch diese Umwandlung ist unmöglich, da die Tiefe Informationen verloren gehen, die von 3d nach 2d.
Allerdings habe ich eine Feste Kamera und ich weiß, seine Kamera-matrix. Ich habe auch eine planare Kalibrierung Muster bekannten Dimensionen - sagen wir mal, in Welt-Koordinaten es hat Ecken (0,0,0) (2,0,0) (2,1,0) (0,1,0). Mit opencv kann ich schätzen das Muster in der pose, wodurch die translation und rotation Matrizen benötigt werden, um Projekt zu einem Punkt auf dem Objekt um ein pixel in das Bild.
Nun: dieses 3d-Bild-Projektion ist einfach, aber wie wäre der andere Weg? Wenn ich abholen ein pixel in dem Bild, das ich wissen ist Teil des Kalibrierungs-Muster, wie bekomme ich die entsprechende 3d-Punkt?
Ich könnte iterativ wählen Sie einige zufällige 3d-Punkt auf die Kalibrierung Muster -, Projekt-2d und optimieren der 3d-Punkt auf der Grundlage der Fehler. Aber das scheint ziemlich schrecklich.
Gegeben, dass diese unbekannten Punkt hat die Welt-Koordinaten etwas wie (x,y,0) -- da muss es liegen, die auf der z=0 Ebene -- wie es scheint, sollte es eine transformation, die ich anwenden kann, anstatt die iterative Unsinn. Mein Mathe ist nicht sehr gut aber kann jemand arbeiten aus dieser transformation und erklären, wie Sie ableiten?
- Wie kann ich wissen, die Welt-Koordinaten (x,y,z)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Sie können. Wenn Sie eine Transformationsmatrix, die Google maps einen Punkt in der 3d-Welt in die Bildebene, können Sie einfach die inverse dieser Transformationsmatrix zum anzeigen einer Bild-Ebene, Punkt-zu-3d-Welt zeigen. Wenn Sie bereits wissen, dass z = 0 für die 3d-Welt zeigen, ist das Ergebnis eine Lösung für den Punkt. Es gibt keine Notwendigkeit, um iterativ wählen Sie einige zufällige 3d-Punkt. Ich hatte ein ähnliches problem, wo ich eine Kamera montiert auf einem Fahrzeug mit bekannter position und Kamera-Kalibrierungs-matrix. Ich brauchte, um zu wissen, die Reale Welt Position einer Markierung erfasst, die auf dem Bild die Stelle der Kamera.
Hier ist eine geschlossene form der Lösung, die ich hoffe mit kann jemand helfen. Mit den Konventionen in der Bild aus deinem Kommentar oben, die Sie verwenden können, zentriert, normiert pixel-Koordinaten (in der Regel nach der verzerrungskorrektur) u und v, und extrinsischen Kalibrierdaten, wie diese:
Diese Zwischenwerte, die Koordinaten, die Sie wollen, sind:
Erklärung:
Den Vektor [t1, t2, t3]t ist die position für den Ursprung des Welt-Koordinatensystems (die (0,0) Ihre Kalibrierung-Muster) mit Bezug auf die Kamera optische Mitte; durch die Umkehrung Zeichen und inversing die Rotations-transformation erhalten wir den Vektor T = [Tx, Ty, Tz]t, was ist die position der Kamera-center in der world reference frame.
Ähnlich, [u, v, 1]t ist der Vektor, in dem liegt der beobachtete Punkt in der Kamera-Referenz-frame (ab Kamera-center). Durch inversing die Rotations-transformation erhalten wir den Vektor d = [dx, dy, dz]t, das entspricht der gleichen Richtung, in world reference frame.
Invertiert die Drehung nutzen wir die Tatsache, dass die inverse einer rotationsmatrix ist Ihre Transposition (link).
Wir haben nun eine Linie mit Richtungsvektor d ab Punkt T, der Schnittpunkt dieser Linie mit der Ebene Z=0 ist gegeben durch den zweiten Satz von Gleichungen. Beachten Sie, dass es wäre ähnlich leicht zu finden, die den Schnittpunkt mit der X=0 oder Y=0, Flugzeugen oder mit einer beliebigen Ebene parallel zu Ihnen.
Wenn du Z=0 für Punkte in Welt-Koordinaten (was sollte wahr sein, für planar calibration pattern), statt inversing Drehung, können Sie berechnen, homography für Ihr Bild von der Kamera und Kalibrier-Muster.
Wenn Sie homography Sie können auswählen, zeigen Sie auf das Bild und dann, um seine Position in Welt-Koordinaten mit der inversen homography.
Dies gilt solange, wie der Punkt in Weltkoordinaten ist auf der gleichen Ebene wie die Punkte für die Berechnung dieser homography (in diesem Fall Z=0)
Dieser Ansatz für dieses problem war auch unten diskutiert diese Frage SO: Die Umwandlung von 2D-Bild-Koordinaten in 3D-Welt-Koordinaten mit z = 0