Autor |
Beitrag |
winx
      
Beiträge: 249
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ 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
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
      
Beiträge: 31
WIN XP
Delphi 2005 Personal
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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!
|
|