Einzelnen Beitrag anzeigen

Perlsau
(Gast)

n/a Beiträge
 
#1

Bewegungsmelder Webcam DsPack FilterGraph

  Alt 9. Sep 2011, 14:05
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;
Miniaturansicht angehängter Grafiken
bewegungsmelder.jpg  
  Mit Zitat antworten Zitat