Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Bewegungsmelder Webcam DsPack FilterGraph (https://www.delphipraxis.net/162921-bewegungsmelder-webcam-dspack-filtergraph.html)

Perlsau 9. Sep 2011 14:05

Bewegungsmelder Webcam DsPack FilterGraph
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.:cry:

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;

himitsu 9. Sep 2011 14:23

AW: Bewegungsmelder Webcam DsPack FilterGraph
 
Zitat:

Vielleicht bekommt ein Interessierter heraus, wo die Schutzverletzung ausgelöst wird, mir ist das bislang nicht gelunge
Debuggen?

Und wenn das wirklich mal nichts hilft, dann hilft Logging (an wichtigen Stellen wird geloggt und nach der letzten und dem nächsten Logeintrag liegt der Fehler)

Wozu ist eigentlich das bremsende und völlig unnötige
Delphi-Quellcode:
Application.ProcessMessages;
?

Sicher daß ein Nummerischer/mathematischer Wert sich gut eignet, für einen binären Vergleich?
Delphi-Quellcode:
Maske := Mask DIV Track_Color.Max * Track_Color.Position;
Das Rechenergebnis ist garantiert meistens nicht geeignet für sowas.

Und warum schreibst du in einer Konstante rum?

Auch wenn es nicht unbedingt falsch ist, aber IF erwartet einen Booleanischen Wert und dein Result ebenso ... warum nicht kombinieren?
Delphi-Quellcode:
IF Fehler > (UpDown_Sensi.Position * 10) THEN
Result := FALSE ELSE
Result := TRUE;
Delphi-Quellcode:
Result := Fehler <= UpDown_Sensi.Position * 10;

DeddyH 9. Sep 2011 14:30

AW: Bewegungsmelder Webcam DsPack FilterGraph
 
Zitat:

Delphi-Quellcode:
CONST
     Mask : Cardinal = $FFFFFFFF;
VAR
   Maske : Cardinal;

:roll:

himitsu 9. Sep 2011 14:33

AW: Bewegungsmelder Webcam DsPack FilterGraph
 
Bei diesem Englischdeutschmischmasch darf man sich doch mal verlesen. :oops:

Perlsau 9. Sep 2011 14:36

AW: Bewegungsmelder Webcam DsPack FilterGraph
 
Zitat:

Zitat von himitsu (Beitrag 1122952)
Zitat:

Vielleicht bekommt ein Interessierter heraus, wo die Schutzverletzung ausgelöst wird, mir ist das bislang nicht gelunge
Debuggen?

Hab ich versucht: er durchläuft die FOR x Schleife nur einmal und löst an deren Ende den Fehler aus.

Zitat:

Zitat von himitsu (Beitrag 1122952)
Und wenn das wirklich mal nichts hilft, dann hilft Logging (an wichtigen Stellen wird geloggt und nach der letzten und dem nächsten Logeintrag liegt der Fehler)

Das ist eine gute Idee, das werde ich gleich mal ausprobieren.

Zitat:

Zitat von himitsu (Beitrag 1122952)
Wozu ist eigentlich das bremsende und völlig unnötige
Delphi-Quellcode:
Application.ProcessMessages;
?

Das ist noch übrig von meinen anfänglichen Testreihen, habs vergessen rauszunehmen.

Zitat:

Zitat von himitsu (Beitrag 1122952)
Sicher daß ein Nummerischer/mathematischer Wert sich gut eignet, für einen binären Vergleich?
Delphi-Quellcode:
Maske := Mask DIV Track_Color.Max * Track_Color.Position;
Das Rechenergebnis ist garantiert meistens nicht geeignet für sowas.

Ich dachte mir, daß es hier auf Genauigkeit nicht weiter ankommt. Der Variable Maske soll nur ein ungefährer Wert übergeben werden, ausgehend von $FFFFFFFF, dem Wert der Konstante Mask.

Zitat:

Zitat von himitsu (Beitrag 1122952)
Und warum schreibst du in einer Konstante rum?

Die Konstante Mask wird doch nicht verändert, sondern lediglich als Ursprungswert genommen.

Zitat:

Zitat von himitsu (Beitrag 1122952)
Auch wenn es nicht unbedingt falsch ist, aber IF erwartet einen Booleanischen Wert und dein Result ebenso ... warum nicht kombinieren?
Delphi-Quellcode:
IF Fehler > (UpDown_Sensi.Position * 10) THEN
Result := FALSE ELSE
Result := TRUE;
Delphi-Quellcode:
Result := Fehler <= UpDown_Sensi.Position * 10;

Danke, dein Code ist eleganter als meiner, den nehm ich gerne :-D

So, jetzt mach ich mich ans Logfile ... diese Idee wäre mir wohl nicht so schnell von alleine gekommen, danke.

Der.Kaktus 9. Sep 2011 14:38

AW: Bewegungsmelder Webcam DsPack FilterGraph
 
Zitat:

Zitat von DeddyH (Beitrag 1122953)
Zitat:

Delphi-Quellcode:
CONST
     Mask : Cardinal = $FFFFFFFF;
VAR
   Maske : Cardinal;

:roll:

Mask<>Maske :wink:

:cheers:

himitsu 9. Sep 2011 14:46

AW: Bewegungsmelder Webcam DsPack FilterGraph
 
Was mach GreyBitmap denn eigentlich?

KarstenK 9. Sep 2011 14:48

AW: Bewegungsmelder Webcam DsPack FilterGraph
 
So aus dem blauen Nebel:

if (Bild1.Height<>Bild2.Height) or das gleiche in der Breite

sind sie verschieden.

himitsu 9. Sep 2011 14:57

AW: Bewegungsmelder Webcam DsPack FilterGraph
 
Zitat:

Zitat von KarstenK (Beitrag 1122961)
So aus dem blauen Nebel:

Jupp, das muß natürlich auch übereinstimmen.


Wegen der "Genauigkeit" ... es kommt nicht auf die Genauigkeit drauf an, sondern auf die binäre darstrellung der Werte.
Bei soeiner mathematich unstabilen Rechnung kommen die wildestens Bitkombinationen raus, was dann zu anderen Ergebnissen führt, was du eventuell erwartest.

Delphi-Quellcode:
P1^   = 29 aka b00011101
P2^   = 76 aka b01001100
Maske = 44 aka b00101100 = beide Werte gleich
Maske = 156 aka b10011100 = P1 größer als P2
Maske = 255 aka b11111111 = P2 größer als P1

Und bei den Integerzugriffen mußt du beachten, daß du mit 4 Byte zugreifst, aber deine Pixel nur 3 Bits (pf24) groß sind und du somit meistens ein Byte eines anderen Pixels mit einrechnen könntest.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:35 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