Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Algorithmus zum Kamerabilder entzerren? (https://www.delphipraxis.net/112443-algorithmus-zum-kamerabilder-entzerren.html)

winx 29. Apr 2008 09:27

Re: Algorithmus zum Kamerabilder entzerren?
 
Stimmt leider fehlt das. Könntest dus nochmal hochladen?

danke

mr.winkle 29. Apr 2008 12:02

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:
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;
Es besteht noch ein wenig optimierungsbedarf aber wenn ich das habe dann poste ich es hier.

mfg, mr.winkle

winx 29. Apr 2008 16:07

Re: Algorithmus zum Kamerabilder entzerren?
 
Danke!!!

Könntest du bitte noch das komplette Projekt hochladen, wär spitze :-D

gruß,
winx

mr.winkle 30. Apr 2008 01:41

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:59 Uhr.
Seite 2 von 2     12   

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