Perspektivische Transformation einer nichtplanaren Oberfläche
-
Hallo zusammen,
Ich habe mit einer Kamera eine Straße aufgenommen. Die Perspektive aus der aufgenommen sehr ihr in dieser Skizze. Nun möchte ich die Straße so verzerren, als würde ich von oben (gefälschte Vogelperspektive) draufgucken. Das kann man theoretisch sehr einfach mit OpenCVs
getPerspectiveTransform()
oder Matlabsfitgeotrans()
erreichen.Nun habe ich aber das Problem, dass die Straße nicht perfekt eben ist, sondern nach hinten raus immer weiter abfällt. Auf dem Kamera Bild sieht es in etwa so wie die roten Striche in der Skizze aus. Dadurch lässt sich mein Problem leider nicht mehr so einfach lösen.
Ich habe die 2D Koordinaten der Straße im Bild, ich habe die 3D Koordinaten der Straße in der Welt und ich habe alle Kameraparameter. Ich habe schon rausgefunden, dass ich mit OpenCVs
solvePnP()
oder MatlabsestimateWorldCameraPose()
die Position und Blickrichtung der Kamera in der Welt ausrechnen kann. Wie komme ich mit der Info nun aber an eine Transformation, mit der ich die gewünschte "Vogelperspektive" erreichen kann? Hier hänge ich gerade und habe keine Idee.Ich hoffe mir kann jemand weiterhelfen
-
Es gab da mal einen Film, ich glaube, er hieß "Die Entzerrung der Welt" oder so. Da ist mir noch ein Zitat hängengeblieben: "Aber die Welt ist nicht flach".
Man könnte jetzt einfach solange drehen, bis die gedachten Verbindungslinien der Randpunkte senkrecht zu der Blickachse stehen.
Aber jetzt kommt das Elastic Nodes Example von Qt.
Man nimmt den einfachen Algorithmus vom Elastic Nodes Example, erweitert ihn auf den dreidimensionalen Raum und baut ein Riesengitter, bei dem man alle Punkte von dem geographischen Abbild als eigenen Knoten einfügt.
Mitsamt dem Pixelfarbwert an jedem Knoten.
Man könnte wohl auch so eine Art Voxelspace verwenden, indem man von einer noch zu spannenden Ebene ausgeht (eventuell horizontal und vertikal mit zwei Kurven eine Kugel unterhalb als Gitterform bilden) und die Höheninformation als Y-Abstand in der Ebene mitspeichert.
Das Riesengitter kann man anschließend einfach spannen, indem man die Eckknoten in einer Raumdimension voneinander wegbewegt und in den restlichen Raumdimensionen aufeinander zubewegt.
So irgendwie. Braucht zwar ziemlich viel Rechenleistung, aber man macht das ja heute nicht mehr mit Zettel und Stift.
Jetzt kommen die phantastischen theoretischen Möglichkeiten (zusammenhängend, wenn auch leicht Off-Topic):
man erstellt Sets Deformationskräfte, die man auf das Gitter wirken läßt. Diese Sätze Deformationskräfte baut man mit evolutionären Algorithmen untereinander um und bewertet sie anhand eines Fuzzy-Logic-Matchings von auf das Gitter geschriebenen Buchstaben.
Dann könnte man eventuell zerknittertes Papier lesen.
Darum geht es hier ja.
Man gibt den Deformationskräften eine Zeit, in der sie wirken und stellt sicher, daß, wenn es sich etwa um unelastisches Papier handeln würde, daß dabei aufeinanderfolgende Faltungen entstehen.
Dann hätte man etwa ein piktographisches Bild von einem Schiffchen schwammig als Vektorgrafik parametisiert. Nach den Faltungen macht er einen Fuzzy-Logic-Vergleich mit den Umrissen. Ein Origami-Generator?!Ach, nebenbei (man schmeißt zwar keine Threads durcheinander, aber ist jetzt hoffentlich eh alles klar): bei der magnetischen Ablenkung im Gegensatz zur elektrostatischen Ablenkung torkeln die Elektronen kreisförmig bis zum Verlassen durch beide Ablenkspulen und die bunten Leuchtschichten stehen mit etwas Abstand hinter der Maske, sodaß der schräge Winkel den Farbunterschied macht. Hatte ich mißverstanden. Und was mich irritierte, war der Spin.
Aber so wie man oft vergißt, daß die Welt nicht flach ist, vergißt man auch externe Magnetfelder (das der Erde, der Sonne, der Milchstraße usw.) oder daß der Magnet ja im Grunde 280 Grad Kelvin warm ist. Wird dann an den Elektronen geschaukelt, können sie wohl einen Bogen schlagen und wie es sie da raushaut, entscheidet das entfernteste Feld, denn das wird als letztes abgeschirmt.
Das Leben und Wirken Foucaults.
-
@Pikkolini
Hast du schon die View Matrix gesetzt?http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/#the-view-matrix