Entwickler-Ecke
Multimedia / Grafik - Algorithmus zum Kamerabilder entzerren?
winx - Mo 21.04.08 16:28
Titel: Algorithmus zum Kamerabilder entzerren?
Hi,
ich habe eine Kamera die in einem bestimmten Winkel auf ein Objekt gerichtet.
Nun möchte ich die aufegnommen Bilder "entzerren", sprich so hinbekommen, das sie aussehen, als ob ich direkt von oben aufnehmen würde.
Ich habe also ein Ausgangsbmp das ich wandeln möchte...
Gibt s dazu irgendwelche Algorithmen?
danke,
winx
BenBE - Sa 26.04.08 17:20
Du meinst, dein Objekt ist durch ein Trapez innerhalb des Bildes gegeben und du möchtest daraus ein Rechteckt machen.
Benutze dazu einfach ne Koordinaten-Transformation, die folgendem Gleichungssystem gerecht wird:
Quelltext
1: 2: 3: 4: 5: 6:
| A ___+B A' B' +--- | +-----+ / | | | / ___---+ | | +--- D +-----+ C C' D' |
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| //Grundregeln: f_P'(A) := A' f_P'(B) := B' f_P'(C) := C' f_P'(D) := D'
//Kantenbedingungen: f_P'((A+B)/2) := (A'+B')/2 f_P'((B+C)/2) := (B'+C')/2 f_P'((C+D)/2) := (C'+D')/2 f_P'((D+A)/2) := (D'+A')/2
//Mittelpunkt: f_P'((A+B+C+D)/4) := (A'+B'+C'+D')/4 |
Wenn du nun Bruchteile von Pixeln bekommst einfach mit Nearest Neightbour interpolieren ...
Einfach vom Zielbild ausgehend jeden Pixel durchgehen ...
BenBE.
elundril - Sa 26.04.08 19:19
in der delphi-praxis.de im code-library bereich ist so ein code veröffentlicht worden.
lg elundril
delfiphan - So 27.04.08 09:36
@BenBE: Die Transformation ist nicht linear. Deine Bedingungen gelten nicht (ausser die Grundregeln natürlich). Der Mittelpunkt ist z.B. dort wo sich die beiden Diagonalen im Rechteck/Trapez schneiden und nicht dort wo der Schwerpunkt ist. Die Kantenbedingung gilt auch nicht.
Martok - So 27.04.08 12:27
Die Graphics32-Lib enthält recht ordentliche Bildtransformations-Tools. Habs zwar selber nicht getestet, aber die Beispielprojekte sehen relativ einfach aus...
delfiphan - So 27.04.08 16:55
Eine Möglichkeit ist vermutlich das 2D-Trapez zuerst in ein 3D-Rechteck (bzw. Parallelogramm, d.h. Bedingung B-A=D-C) umzurechnen. Dabei ist diese Umrechnung bis auf einen Parameter (Distanz zur "Kamera") eindeutig. Setz den fehlenden Parameter einfach auf 1. Im 3D-Raum kannst du dann Punkte auf einem regelmässiges Gitter (bilinear zwischen A,B/A,C) nehmen und diese zurück auf 2D konvertieren.
Für die 3D zu 2D-Konversion einfach durch z teilen:
X2D := X3D/Z3D;
Y2D := Y3D/Z3D;
Mit den genannten Bedingungen kannst du die Transformation in Maple o.ä. berechnen. Kann gut sein, dass es auch mit Matrixrechnung direkter geht. Das Endresultat sollte aber sowieso dasselbe sein. Meinetwegen kann ich die Formeln rechnen lassen, falls sie jemand jetzt noch braucht.
delfiphan - So 27.04.08 20:58
Wenn's schon zwei sind. Hier eine mögliche Lösung, nach obiger Beschreibung (eigene Berechnung ohne Graphics32).
//Edit: Bilineare Interpolation hinzugefügt
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!