AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Kamerabilder vergleichen und nur bei "Bewegung" updaten?
Thema durchsuchen
Ansicht
Themen-Optionen

Kamerabilder vergleichen und nur bei "Bewegung" updaten?

Offene Frage von "winx"
Ein Thema von winx · begonnen am 10. Mai 2008 · letzter Beitrag vom 11. Mai 2008
Antwort Antwort
winx

Registriert seit: 14. Jun 2005
265 Beiträge
 
#1

Kamerabilder vergleichen und nur bei "Bewegung" up

  Alt 10. Mai 2008, 06:36
Hallo,

ist bes möglich 2 Bilder, die nacheinander im 500ms Abstand
mit einer Cam aufgenommen wurden zu vergleichen und die Anzeige
nur bei einer drastischen Veränderung (bzw Bewegung) zu ändern?

Gibt es da in Delphi nen schnellen Algorithmus?

danke,
winx
  Mit Zitat antworten Zitat
Larsi

Registriert seit: 10. Feb 2007
2.262 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Kamerabilder vergleichen und nur bei "Bewegung"

  Alt 10. Mai 2008, 06:56
Hi,
ja es gibt hier in der Delphi-Praxis so einen schnellen Algorithmus der zwei Bilder auf Unterschide untersucht:
Delphi-Quellcode:
type
  PRGBTripleArray = ^TRGBTripleArray;
  TRGBTripleArray = array [0..50000000] of TRGBTriple;

function CompareImages(Image1,Image2:TBitmap):Int64;
var x,y:integer;
    P1,P2:PRGBTripleArray;
    summe1,summe2:integer;
begin
result := 0;
summe1 := 0;
summe2 := 0;
for y := 0 to Image1.Height -1 do
  begin
    P1 := Image1.ScanLine[y];
    P2 := Image2.ScanLine[y];
      if not CompareMem(p1,p2,Image1.Width*SizeOf(TRGBTriple)) then
        begin
          for x := 0 to Image1.Width-1 do
            begin
              inc(summe1,RGB(P1[x].rgbtRed,P1[x].rgbtGreen,P1[x].rgbtBlue));
              inc(summe2,RGB(P2[x].rgbtRed,P2[x].rgbtGreen,P2[x].rgbtBlue));
              if summe1 <> summe2 then
                begin
                  summe1 := 0;
                  summe2 := 0;
                  inc(result);
                end;
            end;
        end;
  end;
Application.ProcessMessages;
end;
Aufruf könnte so sein:
ShowMessage(IntToStr(CompareImages(Image1.Picture.Bitmap,Image2.Picture.Bitmap)));
Du musst dann halt das Webcambild abspeichern und in einem Image laden was aber auch ganz einfach geht:
Delphi-Quellcode:
function SaveWebcamPictureDIB(pFileName: PChar;WebcamHandle: THandle):Boolean;
const WM_CAP_FILE_SAVEDIB = WM_USER + 25;
begin
if IsWindow(WebcamHandle) then
  result := (SendMessage(WebcamHandle,WM_CAP_FILE_SAVEDIB,0,LPARAM(pFileName)) <> 0)
else
  result := false;
end;
Afuruf könnte dann so sein:
SaveWebcamPictureDIB(PChar('C:\test.jpg'),VideoHandle);
Dann ist es wenigstens schonmal abgespeichert, jetzt kannst du es ja über:
Image1.Picture.LoadFormFile('C:\test.jpg'); einfach laden und vergleichen!

Alles klar?

Der Code mit dem Speichern funktioniert nur wenn du das mit dem Webcam Stream über die Variante hier in der Codelib gemacht hast!


MFG Lars Wiltfang
Ein Tag ohne Delphi ist ein verlorener Tag!

Homepage zu meinem neuen Programm: StreamZ
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Kamerabilder vergleichen und nur bei "Bewegung"

  Alt 10. Mai 2008, 07:33
ho larsi,

du machst das ja direckt über die RGB werte, evtl störungsunanfälliger wäre es wenn du über die Luminanze daten gehst.

und da nur abweichungen >= z.b. 0.1 wertest. Denn JPG ist da denke ich sonst zu anfällig. Und winx schreibt ja bei "Großer" abweichung.

Klar das er seinen Int64 Wert entsprechend mit was hohem vergleichen kann. das geht natürlich auch.

Ausprobieren würde ich das aber trotzdem.

man könnte z.b. Auch ne Prozentuale Abweichung angeben.

Also wenn er sein Ergebniss / (width*height) Teilt, oder so ...
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Larsi

Registriert seit: 10. Feb 2007
2.262 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Kamerabilder vergleichen und nur bei "Bewegung"

  Alt 10. Mai 2008, 07:37
Er hätte mal suchen sollen, Delphi-Treff hat da auch was
Ein Tag ohne Delphi ist ein verlorener Tag!

Homepage zu meinem neuen Programm: StreamZ
  Mit Zitat antworten Zitat
winx

Registriert seit: 14. Jun 2005
265 Beiträge
 
#5

Re: Kamerabilder vergleichen und nur bei "Bewegung"

  Alt 10. Mai 2008, 07:54
Hi,

danke schonmal

Sollte ich also das ganze mit den Luminazen oder deinen Algorithmus machen?
Wisst ihr, ob das auch mit TBitamp32 geht?

gruß,
winx
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Kamerabilder vergleichen und nur bei "Bewegung"

  Alt 10. Mai 2008, 12:23
Klar geht das,

was da oben ja nicht steht ist das du
Bitmap.pixelformat := pf24Bit; machen must das der Algo tut.

und wenn du dann anstatt TRGBTripleArray einfach etwas der Art :

Delphi-Quellcode:
Type
  PBGRA = ^TBGRA;
  TBGRA = Record
    Alpha : Byte;
    Blue : Byte;
    Green : Byte;
    Red : Byte;
  end;
Dann kannst du auch auf

Bitmap.pixelformat := pf32Bit; Zugreifen.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
winx

Registriert seit: 14. Jun 2005
265 Beiträge
 
#7

Re: Kamerabilder vergleichen und nur bei "Bewegung"

  Alt 10. Mai 2008, 13:28
danke,

werd ich mir mal angucken und mich dann wieder melden.

gruß
  Mit Zitat antworten Zitat
winx

Registriert seit: 14. Jun 2005
265 Beiträge
 
#8

Re: Kamerabilder vergleichen und nur bei "Bewegung"

  Alt 11. Mai 2008, 11:59
Hi,

also ich habe jetzt den Code versucht:

Delphi-Quellcode:
type
  PRGBTripleArray = ^TRGBTripleArray;
  TRGBTripleArray = array [0..50000000] of TRGBTriple;

function CompareImages(Image1,Image2:TBitmap):Int64;
var x,y:integer;
    P1,P2:PRGBTripleArray;
    summe1,summe2:integer;
begin
result := 0;
summe1 := 0;
summe2 := 0;
Image1.PixelFormat := pf24bit;
Image2.PixelFormat := pf24bit;

for y := 0 to Image1.Height -1 do
  begin

    P1 := Image1.ScanLine[y];
    P2 := Image2.ScanLine[y];
      if not CompareMem(p1,p2,Image1.Width*SizeOf(TRGBTriple)) then
        begin
          for x := 0 to Image1.Width-1 do
            begin
              inc(summe1,RGB(P1[x].rgbtRed,P1[x].rgbtGreen,P1[x].rgbtBlue));
              inc(summe2,RGB(P2[x].rgbtRed,P2[x].rgbtGreen,P2[x].rgbtBlue));
              if summe1 <> summe2 then
                begin
                  summe1 := 0;
                  summe2 := 0;
                  inc(result);
                end;
            end;
        end;
  end;
Application.ProcessMessages;
end;

Leider bekomme ich sogar bei Bildern ohne jegliche
Bewegung (also immer identisch) Werte von 280.000.

Woran kann das liegen?

Werde jetzt mal die Alpha Werte mit einbinden...

gruß
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14: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