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


BenBE - Sa 26.04.08 21:58

Sei doch nicht immer so zurückhaltend mit Links, das ist ja schrecklich!

Ach ja: Crosspost DP [http://www.delphipraxis.net/post877390.html].


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.


soong101 - So 27.04.08 18:58

Tja winx, dein Problem findet regeres Interesse als meins [http://www.delphi-forum.de/topic_Einfache+Bitmap+verzerren++Trapez+gt+Quadrat_82708.html]. ;) Ich werde es auch mit Graphics32 versuchen. Nach einigen Problemen mit der miesen Installationsanweisung hab ichs jetzt in mein Projekt eingebunden. Die Unit GR32_Transforms bietet einiges, schaus dir mal an: http://graphics32.org
Viel Erfolg!


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