ich versuche mich gerade an einer Bildentzerrung um wahre Längen aus Fotos zu erhalten. Dazu ist ein 8x8-Gleichungssystem zu lösen, welches ich ich mit "slegen" aus NumLib gelöst habe. Die Lösung stimmt auch, konnte ich mit Excel verifizieren. Der Lösungsvektor hat die 8 Koeffizienten a0 bis a7.
Mit den Koeffizienten kann man mit folgenden zwei Formeln:
xWelt = (a0 * u + a1 * v + a2) / (a6 * u + a7 * v +1) und yWelt = (a3 * u + a4 * v + a5) / (a6 * u + a7 * v +1) die "wahren Koordinaten" berechnen. Bei "u" und "v" handelt es sich um die Pixelkoordinaten des Ausgangsbildes.
Ich würde jetzt gerne aufgrund der Pixelkoordinaten des Ausgangsbildes das entzerrte Bild berechnen. Einen Anfang habe ich gemacht aber es kommt nix vernünftiges bei raus. Hier mein Ansatz:
Code: Alles auswählen
Breite := FrmBild.Image1.Picture.Bitmap.Width;
Hoehe := FrmBild.Image1.Picture.Bitmap.Height;
EntzBMP:= TBitmap.Create;
EntzBMP.SetSize(Breite, Hoehe);
EntzBMP.PixelFormat:=FrmBild.Image1.Picture.Bitmap.PixelFormat;
for i:=0 to Breite-1 do begin
for j:=0 to Hoehe-1 do begin
EntzBMP.Canvas.Pixels[i,j]:= FrmBild.Image1.Picture.Bitmap.Canvas.Pixels[Round(((a[0] * i +a[1] * j +a[2])/(a[6] * i +a[7] * j +1))), Round(((a[3] * i +a[4] * j +a[5])/(a[6] * i+a[7] * j +1)))];
end;
end;
ShowMessage('Entzerrtes Bild berechnet!');
FrmEntzerrt.Image1.Picture.Bitmap.Assign(EntzBMP);
FrmEntzerrt.Show;
EntzBMP.Free;
Die Neuberechnung des Bildes dauert, bei einer Auflösung von 1920 x 1440 auch etwas. Kann man das irgenwie, evtl. durch Verwenden von BGRABitmap, beschleunigen?
Vielen Dank für Eure Hilfe
Volker