Rückprojektion Bild->Szene?



  • Hallo alle miteinander 🙂

    Ich habe momentan das Problem, dass ich ein Bild und Tiefeninformationen für jeden Pixel habe, und aus diesen nun die ursprüngliche Szene "rückprojezieren" will.

    Jetzt habe ich mir überlegt, dass wenn ich die Projektionsmatrix für die Projektion von P^3 nach P^2 habe, ich dann die Szene zurückgewinnen könnte,indem ich die Abbildung einfach invertiere. Ich habe mich auch schon durch Fachliteratur gelesen, aber irgendwie habe ich zu diesem Punkt nie etwas gefunden.

    Da die Kameramatrix eine 3x4-Matrix ist, ist sie selbst schon einmal nicht invertierbar. Was Sinn machen würde, wäre eventuell die Transponierte zu verwenden, aber an der Stelle würde ich nur noch raten. Kennt sich da vielleicht jemand besser aus?



  • Wieso hast du eine 3x4 Matrix für die Kamera? Soweit ich weiß werden immer 4x4 Matrizen benutzt, nämlich um Punkte und Vektoren gleich behandeln zu können. Als vierte Koordinate wählt man für Punkte eine 1 und für Vektoren eine 0. Das hat was mit projektiver Geometie zu tun, führt hier allerdings vllt etwas zu weit. Ich nehme mal an, dass deine vierte Spalte deiner Kameramatrix dann die Position der Kamera im Raum ist. Da brauchst du dann nur die Zeile [0 0 0 1] unten einfügen. Dann bekommst du eine 4x4 Matrix und die brauchst du dann einfach nur noch zu invertieren und fertig.



  • Was mir noch einfällt, es gibt in diesem Zusammenhang natürlich zwei Projektionsmatrizen einmal die von der Weltkamera (P_Cam) und einmal die um die Projektion der Objekte in 3D auf die Viewplane zu realisieren (P_View), da bekommt man dann die Bildpunkte mit den Pseudotiefen als z Koordinate. Da stellt sich hier natürlich die Frage ob deine Tiefenwerte diesen Pseudotiefen entsprechen oder etwas anderem. P_View hängt dabei von deiner Near- und Far-Plane ab.
    Hast du für dein Problem P_View etwas anders gewählt musst du P_View natürlich entsprechend anpassen und abändern.
    Unabhängig davon, berechnest du deine Punkte auf dem Bild dann folgendermaßen:

    $ p_{2D} = P_{View}\cdot P_{Cam}^{-1}\cdot p_{3D} $

    hierbei ist die Reihenfolge der Multiplikation natürlich wichtig, wie bei fast allen Matrixmultiplikationen, diese musst du dann umkehren und erhälst deine 3D-Punkte anhand deiner 2D-Punkte mit Tiefenwerten.



  • Ohje, ich hätte mich wahrscheinlich präzisieren sollen - mit 3D-Grafik hat meine Kameragrafik nämlich herzlich wenig zu tun.

    Das Problem ist folgendes: Ich bekomme ein Tiefenbild einer Stereokamera, d.h. für jeden Punkt habe ich seine angenäherte Tiefe in der Welt angegeben. Jetzt ist der nächste Schritt, aus diesen Daten eine 3D-Szene zu generieren, ich muss also jedem Punkt des Bildes einen Punkt im Raum zuordnen. Als Hilfsmittel bekomme ich noch die Kalibrierungsmatrix der Kamera zurückgeliefert, und das ist bereits die ausmultiplizierte Projektions+Kameramatrix und die hat die Größe 3x4. Das macht Sinn, da wir ja eine Projektion aus dem P3\mathbb{P}^3 auf den P2\mathbb{P}^2 haben. (und nebenbei gibt es in der Realität sowas wie Near oder Far-plane nicht 🙂 )

    Als vierte Koordinate wählt man für Punkte eine 1 und für Vektoren eine 0. Das hat was mit projektiver Geometie zu tun, führt hier allerdings vllt etwas zu weit.

    Wäre auch vergeudete Liebesmüh, weil ich den Projektionsraum an sich bereits kenne. Ich weis, warum das mathematisch so Sinn macht :).

    Aber shconmal danke für die Hilfe 🙂

    ps: ich hasse das Latex hier. Man sollte meinen, dass er \mathbb{P} kennen sollte. das P steht für den Projektionsraum

    //edit
    Mir kommt Grad ne Idee.
    Eigentlich ist meine Kameramatrix im einfachsten Fall nichts weiter als

    P=(f0000f000010)=(K0)P=\begin{pmatrix}f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0\end{pmatrix} =\left(K|0\right)

    wobei K die vordere 3x3 Matrix ist und 0 der hintere Nullvektor.
    In diesem Fall würde es doch reichen, einfach K als Projektive Transformation zu interpretieren, dann zu invertieren und dann die Inverse nutzen, um die Punkte zu transformieren. Die Punkte wären dann zwar immer noch im P^2, aber man könnte diese dann einfach in den P^3 transformieren indem die 4. Koordinate auf 1 gesetzt wird.

    Was sagt ihr dazu?



  • otze schrieb:

    Als Hilfsmittel bekomme ich noch die Kalibrierungsmatrix der Kamera zurückgeliefert, und das ist bereits die ausmultiplizierte Projektions+Kameramatrix und die hat die Größe 3x4. Das macht Sinn, da wir ja eine Projektion aus dem P3\mathbb{P}^3 auf den P2\mathbb{P}^2 haben.

    Und wo ist jetzt die Tiefeninformation?

    P\mathbb{P}



  • wofür ist denn die 4. spalte überhaupt da, wenn die nur 0 ist?



  • otze schrieb:

    ps: ich hasse das Latex hier. Man sollte meinen, dass er \mathbb{P} kennen sollte. das P steht für den Projektionsraum

    Das Latex hier ist aus irgendeinem Grund standardmäßig nicht im mathematischen Modus. Könnte man auch mal ändern.



  • FreakyBKA schrieb:

    wofür ist denn die 4. spalte überhaupt da, wenn die nur 0 ist?

    Wie gesagt, das war der einfachste Fall. Laut meiner Literatur ist der schlimmste Fall der mir passieren kann, dass die Matrix die Form

    P=K \cdot \left[R|-RC\right]

    hat, wobei K eine ähnliche Matrix wie die oben ist, R eine Rotationsmatrix und C ein Verschiebungsvektor. Da mich diese Daten aber nicht interessieren, müsste ich in dem Fall nur die Teilmatrix KR aufteilen(und dafür gibt es glücklicherweise einen Algorithmus).

    Und wo ist jetzt die Tiefeninformation?

    Die Tiefeninformation habe ich ja bereits durch das Tiefenbild. Was ich mache ist, dass ich den Bildpunkt an der Stelle (x,y) mit Tiefeninformation t in einen Punkt aus $$\mathbb{P}^2$$ umwandel, wobei ich ihm die Koordinaten (x,y,t) gebe. Und dieser Punkt ist schließlich nichts anderes, als das was mir die Projektionsmatrix geben würde, wenn ich den ursprünglichen Punkt in der Szene dort rein stecken würde.

    @Bashar irgendwie ist der Modus generell komisch. Wäre Latex nicht im Math-Modus, würde es ja zum Beispiel die Matrizen nicht erkennen. Das tut es aber. Naja, Hauptsache es klappt mit ......



  • also wenn du (x,y,t) schon hast, dann musst du nur noch den near-plane abstand kennen und schon weißt du wo deine puntke im raum liegen, wäre dann nur strahlensatz.
    bevor du jetzt sagst es gibt keine near-plane, dann würde nur eine orthoganle projektion auf das bild gehen, was den raumausschnitt sehr klein machen würde (sowas wie tunnelblick). mal abgesehen davon wäre dann (x,y,t) schon dein punkt im raum.
    also müsste man erstmal herausbekommen, wie nah die near-plane dran ist. der rest ist dann wie gesagt strahlensatz, man brauch dafür aber halt den near-plane-abstand.



  • FreakyBKA schrieb:

    also wenn du (x,y,t) schon hast, dann musst du nur noch den near-plane abstand kennen und schon weißt du wo deine puntke im raum liegen, wäre dann nur strahlensatz.

    Gut, dann sehen wir das ja ähnlich :). Zumindest wenn du unter "Near Plane" das verstehst, was ich als "Bildebene" kenne. Es ist allerdings nicht ganz der Strahlensatz, da die Matrix K noch andere wichtige Informationen enthalten kann, die in dem Zusammenhang gebraucht werden(zum Beispiel eine Umwandlung von Pixelkoordinaten in Ebenenkoordinaten). Ansonsten, wenn du dir die Matrix oben anschaust, dann ist f der Abstand der Bildebene von der Kameraposition.

    Also ich denke, K invertieren sollte die richtige Projektion ergeben, danke für deine Hilfe. Werde mich dann nochmal demnächst melden, wenn ich erste Ergebnisse habe(dauert leider noch ne ganze Weile, das Projekt ist noch in der Planungsphase)



  • ja genau, Near-Plane ist die Bildebene, da wo alles drauf projeziert wird.


Anmelden zum Antworten