![]() |
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 |
Re: Algorithmus zum Kamerabilder entzerren?
Im Matlab-Forum scheint jemand das gleiche Problem zu haben aber schon eine Stufe weiter zu sein ;)
![]() mfg, mr.winkle |
Re: Algorithmus zum Kamerabilder entzerren?
|
Re: Algorithmus zum Kamerabilder entzerren?
Oh sorry den Crosspost hab ic vergessen...
Ich hätte folgende Möglichkeiten um das Bild irgendwie u transformieren: a) ich weiss den Kamerawinkel und b) ich könnte bspw zuerst ein Rechteck mit festen Maßen filmen und dieses "orginal" mit den Daten auf dem BMP vergleichen. Irgendwie müsste man dann nur noch ne "umrechung" finden. Nur: wie mache ich das (also das mit der umrechung?)?? danke |
Re: Algorithmus zum Kamerabilder entzerren?
Um was für ein Objekt geht es? Ist es dreidimensional oder fotographierst du ein Bild?
|
Re: Algorithmus zum Kamerabilder entzerren?
Objekte könnten 3dimensonal sein, alledings interessiert mich nur das 2 Dimensionale, dass man seh wenn
man genau von oben draufguckt... |
Re: Algorithmus zum Kamerabilder entzerren?
Das dürfte recht anspruchsvoll werden. Was hast du eigentlich vor?
|
Re: Algorithmus zum Kamerabilder entzerren?
Kannst du vielleicht einmal eines der Bilder anhängen und den Winkel angeben? Wenn das was ich vorhabe funktioniert sage ich bescheid ;)
Zudem kommt ja noch, dass man nicht nur einen Winkel zu einer Fläche hat, also das man in einem anderen Winkel zur nächsten Kante des Objekts einnimmt als zur entferntesten. Extrem genaue Rechnungen sind hier dann wohl nicht zu erwarten... mfg, mr.winkle EDIT: So, da ich das hier für eine interessante Aufgabe halte habe ich ein wenig herumgerechnet und probiere mich jetzt an einem Pixelweisen Algorithmus. Für die Interpolation habe ich allerdings noch keine Idee, da lässt sich aber sicher auf einfachere Alternativen zurückgreifen. |
Re: Algorithmus zum Kamerabilder entzerren?
Liste der Anhänge anzeigen (Anzahl: 2)
Wie versprochen habe ich mal einen Algorithmus programmiert - für deine Zwecke musst du lediglich die Breite des Output-Images richtig einstellen. :angel:
mfg, mr.winkle |
Re: Algorithmus zum Kamerabilder entzerren?
In der ZIP-File fehlt die PAS-File zum Formular (und die DCU zu disassemblieren hab ich keine Lust ;-))
|
Re: Algorithmus zum Kamerabilder entzerren?
Stimmt leider fehlt das. Könntest dus nochmal hochladen?
danke |
Re: Algorithmus zum Kamerabilder entzerren?
Oh, das tut mir Leid.
Hier die Funktion, viel Spaß damit :-D
Delphi-Quellcode:
type arrayoftpoint=array of tpoint;
Delphi-Quellcode:
Es besteht noch ein wenig optimierungsbedarf aber wenn ich das habe dann poste ich es hier.
function showarea(input:tbitmap; area:arrayoftpoint; nHeight,nWidth:integer):tbitmap;
//Showarea procedure by Thomas Feldmann //feldmann.thomas@googlemail.com //Im folgenden werden Methoden zum Rechnen mit Vektoren bereitgestellt type tvector=record x,y:double; end; function vector(vx,vy:double):tvector; begin result.x:=vx; result.y:=vy; end; function makevector(v:tpoint):tvector; begin result.x:=v.x; result.y:=v.y; end; function multiply(vektor:tvector; number:double):tvector; begin result:=vector(vektor.x*number,vektor.y*number); end; function add(v1,v2:tvector):tvector; begin result:=vector(v1.x+v2.x,v1.y+v2.y); end; function sub(v1,v2:tvector):tvector; begin result:=vector(v1.x-v2.x,v1.y-v2.y); end; var A,B,C,D,v,x :tvector; i,j :integer; bit :tbitmap; p1,p2 :^pcardinal; rows :array of pointer; begin //Quell- und Zielbitmap initialisieren input.PixelFormat :=pf32bit; bit :=tbitmap.Create; bit.Height :=nHeight; bit.Width :=nWidth; bit.PixelFormat :=pf32bit; //Bereichsprüfung if length(p)<4 then bit.Canvas.TextOut(10,10,'Bereich nicht genügend festgelegt') else begin //Pointer des Quellbitmaps cachen Setlength(Rows, input.Height); for i:=0 to input.Height-1 do rows[i]:=input.ScanLine[i]; //Vektoren initialisieren A:=makevector(p[0]); D:=makevector(p[3]); B:=makevector(p[1]); C:=makevector(p[2]); //Start des Durchlaufs for i:=0 to bit.height-1 do begin p1:=bit.ScanLine[i]; //Vertikalen Vektor berechnen und verschieben v:=sub(add(D,multiply(sub(C,D),i/bit.Height)),add(A,multiply(sub(B,A),i/bit.height))); for j:=0 to bit.width-1 do begin //Vektor zum gewünschten Pixel x:=add(add(A,multiply(sub(B,A),i/bit.width)),multiply(v,j/bit.Width)); //Pixel in das Zielbitmap übertragen p2:=rows[round(x.y)]; inc(p2,round(x.x)); p1^:=p2^; inc(p1); end; end; end; result:=bit; end; mfg, mr.winkle |
Re: Algorithmus zum Kamerabilder entzerren?
Danke!!!
Könntest du bitte noch das komplette Projekt hochladen, wär spitze :-D gruß, winx |
Re: Algorithmus zum Kamerabilder entzerren?
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, natürlich. Im Anhang das komplette Projekt mit Sourcecode. Die Funktion habe ich noch ein wenig überarbeitet und optimiert.
Viel Erfolg :cheers: mfg, mr.winkle |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz