Hallo DelphiPraxler,
zwei Tage lang hab ich ausgiebig recherchiert, nun konnte ich die ersten Erfolge erzielen: Die Grundfunktionen eines Bewegungsmelders sind niedergeschrieben. Doch, ach, weitere Probleme sind in Sicht.
Der Treiber meiner beiden Webcams – einmal
MiniDV-Kamera und eine Terratec TerraCam USB stellen mehrere Auflösungen zur Verfügung. Beim Start ist bei beiden standardmäßig 360*240 ausgewählt. Damit funktioniert mein Programm bestens, obwohl ich für jede Kamera andere Schwellenwerte einstellen muß. Ebenso kann ich ohne Probleme die anderen Auflösungen wählen wie z.B. 640*480. Doch sobald ich mit einer anderen als der urpsrünglichen Auflösung von 360*240 überwachen will, erhalte ich eine Schutzverletzungen, sobald der Detektor anspringt.
Der komplette Quellcode wäre meines Erachtens zu lang für die Darstellung im Forum, deshalb hab ich ihn auf einer meiner Homepages plaziert:
Bewegungsmelder-Sourcecode
Zum Ausprobieren in der eigenen
IDE sind die
Jedi-Komponenten und das
DS-Pack erforderlich. Man kann aber auch die beiden
Jedi-Komponenten TJvTrackBar und TJvStatusbar mit den herkömmlichen Kompos ersetzen.
Vielleicht bekommt ein Interessierter heraus, wo die Schutzverletzung ausgelöst wird, mir ist das bislang nicht gelungen.
Code zum Bildvergleich:
Delphi-Quellcode:
{******************************************************************************************************************
*** BILDVERGLEICH 2 TRUE bedeutet BILDER SIND GLEICH (CompareImagesShmia) ***
******************************************************************************************************************}
FUNCTION TFormCapture.Bildvergleich2(Bild1, Bild2 : TBitmap): Boolean;
CONST
Mask : Cardinal = $FFFFFFFF;
VAR
Maske : Cardinal;
Fehler,
x, y : Integer;
P1, P2 : PByte;
BEGIN
Fehler := 0;
Maske := Mask DIV Track_Color.Max * Track_Color.Position;
Label_Maske.Caption := IntToStr(Maske);
Bild1 := GreyBitmap(Bild1);
Bild2 := GreyBitmap(Bild2);
Bild1.PixelFormat := pf24bit;
Bild2.PixelFormat := pf24bit;
FOR y := 0 to Bild1.Height -1 DO
BEGIN
P1 := Bild1.ScanLine[y];
P2 := Bild2.ScanLine[y];
FOR x := Bild1.Width-1 DownTo 0 DO
BEGIN
IF (PInteger(P1)^ AND Maske) <> (PInteger(P2)^ AND Maske) THEN
INC(Fehler);
INC(P1, 3);
INC(P2, 3);
Application.ProcessMessages;
END;
END;
IF Fehler > (UpDown_Sensi.Position * 10) THEN
Result := FALSE ELSE
Result := TRUE;
END;