Autor Beitrag
winx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 249



BeitragVerfasst: Mo 21.04.08 16:28 
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
   A    ___+B      A'      B'
    +---   |        +-----+
   /       |        |     |
  /  ___---+        |     |
 +---       D       +-----+
C                  C'      D'


ausblenden 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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Sa 26.04.08 19:19 
in der delphi-praxis.de im code-library bereich ist so ein code veröffentlicht worden.

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 26.04.08 21:58 
Sei doch nicht immer so zurückhaltend mit Links, das ist ja schrecklich!

Ach ja: Crosspost DP.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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...

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 31

WIN XP
Delphi 2005 Personal
BeitragVerfasst: So 27.04.08 18:58 
Tja winx, dein Problem findet regeres Interesse als meins. ;) 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: graphics32.org
Viel Erfolg!

_________________
As Wichita Falls So Falls Wichita Falls
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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
Einloggen, um Attachments anzusehen!