PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bild perspektivisch drehen



Che Guevara
23.09.2020, 00:23
Hi,

für ein aktuelles Projekt nehme ich per Usb-Webcam ein Bild auf.
Aufgrund der Gegebenheiten betrachtet die Kamera das Objekt aber nicht senkrecht von oben, sondern um die x-Achse gedreht (genauer Winkel steht noch nicht fest, werden ca 30° werden).
Auf dem Bild befinden sich verschiedene Punkte, deren Lage zueinander ich bestimmen möchte. Dafür muss ich das Bild drehen, und zwar so, als ob es senkrecht von Oben aufgenommen worden wäre.
Mein Programm ist / wird in Visual Studio C# .net geschrieben, auf externe Bibliotheken etc. möchte ich verzichten!
Laufzeit ist nicht sonderlich relevant, solange die Operation im einstelligen Sekundenbereich bleibt.
Ursprünglich dachte ich an eine Drehmatrix, allerdings fehlt mir momentan noch die zündende Idee wie ich das alles zusammen bringe...
Über Suchvorschläge, Beispielcodes, etc ... wäre ich sehr dankbar!

Vielen Dank & Gruß
Chris

Defiant
23.09.2020, 07:57
Wenn ich deine Beschreibung richtig verstanden habe, dann solltest du im Internet nach dem Stichwort "perspektivische Transformation" suchen. In der OpenCV-Bibliothek in der Funktion warpPerspective() implementiert. OpenCV einzubinden lohnt sich langfristig wenn man etwas mit Bildverarbeitung auf der CPU berechnen möchte.

In Kapitel 3.2.2 dieser Masterarbeit (https://edoc.sub.uni-hamburg.de//haw/volltexte/2012/1769/) wird die perspektivische Transformation zwar für die Implementierung auf einem FPGA erläutert, aber die grundlegenden Konzepte sind ja in der Software-Implementierung ebenfalls gültig.

Holomino
23.09.2020, 08:30
Mal ganz unbedarft gefragt: Geht das bei Objekten mit Tiefeninformation ohne Stereo überhaupt? Z.B. bei einem Haus perspektivisch von oben geknipst würde man keine Wände sehen, aus 30° Schräge heraus schon.

Moppi
26.09.2020, 09:11
Beziehend auf das Bild von Defiant:

So hatte ich das auch verstanden. Meine spontane Antwort wäre gewesen (weil ich das Anfang der 90er, zur Berechnung von 3D-Objekten und den zugehörigen Bitmaps für die Flächen, selbst gemacht/ausprobiert habe ...), ja man kann das machen, es ist eine rel. einfache Berechnung der Pixel.

Aber Holomino:

Stimmt schon so, man bekommt durch eine einfache, zweidimensionale Transformation keine zusätzlichen Bildinformationen. Entweder, es verschwinden welche (weil eine Seite gestaucht wird) oder sie bleiben erhalten, aber es kommen keine neuen hinzu. Das kann man mit einem Grafikprogramm, das so was kann, einfach ausprobieren (bei mir ist das bei Geometrieeffekte: Horizontal-, Vertikalperspektive zu finden).

Che Guevara
26.09.2020, 14:09
Hi,

genau das habe ich gesucht und bin mittlerweile auch einigermaßen fündig geworden:
https://math.stackexchange.com/questions/3509039/calculate-homography-with-and-without-svd
Allerdings verstehe ich nicht, wie man in diesem Beispiel auf die Matrix kommt, weil P^-1 in dem Beispiel multipliziert mit [0 0 0 0 0 0 0 0 1] ergibt bei mir wieder [0 0 0 0 0 0 0 0 1].
Vielleicht könnte sich das jemand ansehen und mir sagen, wo ich einen Denkfehler habe?
In dem Thread scheint sich keiner daran zu stören, weswegen ich davon ausgehe, dass der Lösungsweg richtig ist.

Vielen Dank & Gruß
Chris

EDIT:
Sorry war mein Fehler, hab mir eine Matrix falsch ausgeben lassen und dadurch wurde ich die Inverse dazu auch falsch berechnet.
Mein Code funktioniert jetzt soweit, dass ich ein Bild "drehen" kann.
Vielleicht hätte jemand noch einen leichtverständlichen Code zur Inversiven-Matrix Berechnung zur Hand? Muss momentan noch die Matrix in eine Textform ausgeben lassen, die dann online umrechnen und wieder ins Programm einfügen.

technick
17.05.2022, 20:38
Wir haben so etwas im Portefolio: Zwei Kameras als Stereosystem mit Tiefenmessung und Transformation in eine 3D-Struktur. Problem: Es gibt Bildbereiche, die hinzugelogen werden müssen, weil für diese keine Bildinformationen existieren.