AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Bewegungsmelder Webcam DsPack FilterGraph
Thema durchsuchen
Ansicht
Themen-Optionen

Bewegungsmelder Webcam DsPack FilterGraph

Ein Thema von Perlsau · begonnen am 9. Sep 2011 · letzter Beitrag vom 9. Sep 2011
Antwort Antwort
Perlsau
(Gast)

n/a Beiträge
 
#1

Bewegungsmelder Webcam DsPack FilterGraph

  Alt 9. Sep 2011, 15: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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Bewegungsmelder Webcam DsPack FilterGraph

  Alt 9. Sep 2011, 15:23
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 Application.ProcessMessages; ?

Sicher daß ein Nummerischer/mathematischer Wert sich gut eignet, für einen binären Vergleich?
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;
Result := Fehler <= UpDown_Sensi.Position * 10;
$2B or not $2B

Geändert von himitsu ( 9. Sep 2011 um 15:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#3

AW: Bewegungsmelder Webcam DsPack FilterGraph

  Alt 9. Sep 2011, 15:30
Zitat:
Delphi-Quellcode:
CONST
     Mask : Cardinal = $FFFFFFFF;
VAR
   Maske : Cardinal;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Bewegungsmelder Webcam DsPack FilterGraph

  Alt 9. Sep 2011, 15:33
Bei diesem Englischdeutschmischmasch darf man sich doch mal verlesen.
$2B or not $2B
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#5

AW: Bewegungsmelder Webcam DsPack FilterGraph

  Alt 9. Sep 2011, 15:36
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.

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.

Wozu ist eigentlich das bremsende und völlig unnötige Application.ProcessMessages; ?
Das ist noch übrig von meinen anfänglichen Testreihen, habs vergessen rauszunehmen.

Sicher daß ein Nummerischer/mathematischer Wert sich gut eignet, für einen binären Vergleich?
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.

Und warum schreibst du in einer Konstante rum?
Die Konstante Mask wird doch nicht verändert, sondern lediglich als Ursprungswert genommen.

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;
Result := Fehler <= UpDown_Sensi.Position * 10;
Danke, dein Code ist eleganter als meiner, den nehm ich gerne

So, jetzt mach ich mich ans Logfile ... diese Idee wäre mir wohl nicht so schnell von alleine gekommen, danke.
  Mit Zitat antworten Zitat
Benutzerbild von Der.Kaktus
Der.Kaktus

Registriert seit: 22. Jan 2008
Ort: Erfurt
958 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Bewegungsmelder Webcam DsPack FilterGraph

  Alt 9. Sep 2011, 15:38
Zitat:
Delphi-Quellcode:
CONST
     Mask : Cardinal = $FFFFFFFF;
VAR
   Maske : Cardinal;
Mask<>Maske

Gruss Kaki

Repeat Until true=false;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Bewegungsmelder Webcam DsPack FilterGraph

  Alt 9. Sep 2011, 15:46
Was mach GreyBitmap denn eigentlich?
$2B or not $2B
  Mit Zitat antworten Zitat
KarstenK

Registriert seit: 4. Dez 2007
Ort: Bärenthal
29 Beiträge
 
Delphi 2009 Enterprise
 
#8

AW: Bewegungsmelder Webcam DsPack FilterGraph

  Alt 9. Sep 2011, 15:48
So aus dem blauen Nebel:

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

sind sie verschieden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Bewegungsmelder Webcam DsPack FilterGraph

  Alt 9. Sep 2011, 15:57
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.
$2B or not $2B
  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 09:13 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