Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Zwei Bitmaps miteinander vergleichen (https://www.delphipraxis.net/668-zwei-bitmaps-miteinander-vergleichen.html)

webby 21. Aug 2002 09:09


Zwei Bitmaps miteinander vergleichen
 
Hallo,
Ich bräuche eine Funktion die zwei Bitmaps miteinander vergleicht (mit Toleranzwert, die Bilder stammen von einer Cam) und dann zurückgibt wieviele Pixel sich unterscheiden (oder noch besser wäre wieviel Prozent).
Bisher hätte ich es so versucht, dass ich alle Pixel einzeln vergleich mit Bitmap.Canvas.Pixels[x, y], aber wie sich erraten lässt dauert dass viel zu lange...

Ich hoffe ihr könnt mir helfen.

jbg 21. Aug 2002 09:37

Da kannst das TBitmap.ScanLine[] Array einsetzen. Es ist jedoch abhängig von der verwendeten Farbtiefe des Bitmaps. Bei 24Bit ergeben immer 3 Bytes ein Pixel. Du solltest also vor dem Einsatz von ScanLine die TBitmap.PixelFormat-Eigenschaft setzen (z.B. auf pf24bit).

Und die Prozentangabe ist doch gar kein Problem. Du ermittelst, wieviele Pixel sich unterscheiden, multiplizierst es mit 100 und dividierst das ganze dann durch die Gesamtanzahl alle Pixel.

Prozent := (Ermittelt * 100) div (Width * Heigth);

webby 21. Aug 2002 09:54

Danke!
Ich werde es gleich einmal versuchen!

Hansa 21. Aug 2002 10:26

habe hier noch etwas gefunden. Paßt vielleicht nicht ganz hier hin, aber die Funktion habe ich einmal verwendet, um Records miteinander zu vergleichen. Allerdings liefert sie nur eine Aussage, ob zwei Records (oder Bilder) gleich sind oder nicht. Das mit den Pixeln verstehe ich sowieso nicht, von Hand wirst du kaum 2mal identische Bilder machen. Selbst wenn du keinen Unterschied siehst. Jedes Programm würde dir sagen die Bilder seien zu 100 % nicht identisch, da eine Verschiebung oder Drehung um 1 Pixel schon genügt, damit kein pixel mehr deckungsgleich ist. Ausnahme Deckel auf Kamera. haha.

Code:
Function Comp_Stru ( Var s1, s2; groesse : word ) : boolean;
  Var
    a1 : Array [1..$FFFF] Of Byte Absolute s1;
    a2 : Array [1..$FFFF] Of Byte Absolute s2;
    i : Integer;
    c : integer;
  Begin
    c := 0;
    For i := 1 To groesse Do Begin
      If a1[i]<a2[i] Then Begin
        c := -1;
      End;
      If a1 [i] > a2 [i] Then Begin
        c := 1;
      End;
      Comp_Stru := c <> 0;
    End;
  End;
Für den, meines Erachtens, einzigen Zweck, nämlich bereits vorhandene (auf PC !) Bilder zu ermitteln, müßte die Funktion (entsprechend angepaßt) funktionieren. Schnell ist sie auch. Aufzurufen wäre sie dann so:

Code:
...
VAR bild1,bild2 : Bildtyp;
    gleich     : boolean;
...

gleich := comp_stru (bild1,bild2,sizeof (bildtyp) = 0;
Gruß

Hansa


Code-Tags eingefügt. Mfg. Daniel

webby 21. Aug 2002 16:30

Danke Hansa, aber das mit ScanLine funktioniert schon super!
Die Komplette Routine braucht jetzt nur noch ca. 120 ms (von vorher 4 s).

Und mir geht es ja gar nicht, ob jetzt das Bild verschoben worden ist oder nicht. Ich brauch ja nur den vergleich von zwei Bildern ob sich was bewegt hat. Den Tolleranzwert brauchte ich deshalb, weil ja meine Cam ganz schön flimmert... :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz