Webcam: Bewegung-Erkennung

… nach etlichen Autoaufbrüchen in der letzten Zeit in unserem Ort, habe ich mich nochmals dem einfachen „Bewegungserkennung“ gewidmet.
Diese vergleicht Bild-Pixel in zwei Bildausschnitten - zwei deshalb, weil somit Fehlalarme durch abrupte Helligkeit-Schwankungen
(Sonne / KFZ-Scheinwerfer / „Beleuchter“ ) ausgeschlossen werden.
Da das Skript sehr viel CPU-Zeit frisst, sollte es maximal alle 10 Sekunden ausgeführt werden!
Wer daran Interesse hat und für mehr Infos: hier einfach fragen.
Siehe auch: http://www.ipsymcon.de/forum/showpost.php?p=25434&postcount=1
und http://www.ipsymcon.de/forum/showthread.php?t=1974

MST

PS: ich setze auf unserem Grundstück zusätzlich „IR-Reflexions-Lichtschranken“ mit einer Reichweite von bis zu 11m ein (z.B. Reichelt / IRS 100 / €69,-).
Diese triggern dann das folgende Skript. Die jeweiligen Bilder (siehe Anhang) werden in einer LOG-Datei archiviert.
Trotz Regen und aufkommender Dunkelheit wurde eine Person erkannt (Bild 2).

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Web_Cam_Bilderkennung.ips.php
Trigger  : 
Interval : 
*/

//Einstellungen in px - Oben-Links ist 0,0
// zu überwachendes Bild
$homeX = 450;  // 450 g
$homeY = 340;  // 160
// Referenz-Bild
$homeX_2 = 230;  // 450 g
$homeY_2 = 350;
$homeRadius = 25;
$offset = 10; // 0 bis 255 Helligkeit / Alamrschwelle
$debug= true; // oder false;

$remoteImage = IPS_GetKernelDir()."web\\00000001.jpg";
$localImage = IPS_GetKernelDir()."cam2_mod.gif";
$remoteFile = fopen("$remoteImage",'rb');
$localFile = fopen($localImage,'wb');

if(!$remoteFile || !$localFile) {
   exit; //Error erzeugen!
}

while (!feof($remoteFile)) {
  $chunk = fread($remoteFile,1024);
  fwrite($localFile,$chunk);
}

fclose($localFile);
fclose($remoteFile);

$im = ImageCreateFromJPEG ($localImage);

$schwarz = ImageColorAllocate ($im, 0, 0, 0);
$rot = ImageColorAllocate ($im, 255, 0, 0);
$gelb = ImageColorAllocate ($im, 255, 255, 0);
$blau = ImageColorAllocate ($im, 0, 0, 255);
$color = 0;
$red_sum = 0;
$green_sum = 0;
$blue_sum = 0;
$pixel = 0;
for($x=$homeX-$homeRadius; $x<=$homeX+$homeRadius; $x++) {
   for($y=$homeY-$homeRadius; $y<=$homeY+$homeRadius; $y++) {
      $color =  imagecolorat($im, $x, $y);
      $blue = 0x0000ff & $color;
      $green = 0x00ff00 & $color;
      $green = $green >> 8;
      $red =0xff0000 & $color;
      $red = $red >> 16;
      $gray_pix = ($red + $green + $blue) /3;
      $red_sum = $red_sum + $red;
      $green_sum = $green_sum + $green;
      $blue_sum = $blue_sum + $blue;
      $pixel = $pixel +1;
   }
}
$red_mittel = $red_sum / $pixel;
$green_mittel = $green_sum / $pixel;
$blue_mittel = $blue_sum / $pixel;
$gray = ($red_mittel + $green_mittel + $blue_mittel) /3;
$gray = (int)$gray;

// ####### Ref-BILD 2
$color = 0;
$red_sum = 0;
$green_sum = 0;
$blue_sum = 0;
$pixel = 0;
for($x = $homeX_2 - $homeRadius; $x<= $homeX_2 + $homeRadius; $x++) {
   for($y = $homeY_2 - $homeRadius; $y<= $homeY_2 + $homeRadius; $y++) {
      $color =  imagecolorat($im, $x, $y);
      $blue = 0x0000ff & $color;
      $green = 0x00ff00 & $color;
      $green = $green >> 8;
      $red =0xff0000 & $color;
      $red = $red >> 16;
      $gray_pix = ($red + $green + $blue) /3;
      $red_sum = $red_sum + $red;
      $green_sum = $green_sum + $green;
      $blue_sum = $blue_sum + $blue;
      $pixel = $pixel +1;
   }
}

$red_mittel = $red_sum / $pixel;
$green_mittel = $green_sum / $pixel;
$blue_mittel = $blue_sum / $pixel;
$gray2 = ($red_mittel + $green_mittel + $blue_mittel) /3;
$gray2 = (int)$gray2;

$grayold = GetValueInteger("WebCam_gray_old");    // Wert "holen"
$grayold2 = GetValueInteger("WebCam_gray_old_2");    // Wert "holen"
$diff = $gray - $grayold;
$diff2 = $gray2 - $grayold2;
$diff_bilder = abs($diff -$diff2);

    if ($diff_bilder > $offset){
      if (GetValueBoolean("WebCam_Bewegung_erkannt") == False){
         SetValueBoolean("WebCam_Bewegung_erkannt", True);
         echo "Bewegung -Alarm
";
     }
   }else{
      if (GetValueBoolean("WebCam_Bewegung_erkannt") == True){
         SetValueBoolean("WebCam_Bewegung_erkannt", False);
      }
   }

SetValueInteger("WebCam_gray_old_2", $gray2);    // Wert "merken"
SetValueInteger("WebCam_gray_old", $gray);    // Wert "merken"

if($debug) {
   imagerectangle($im, $homeX-$homeRadius, $homeY-$homeRadius, $homeX+$homeRadius, $homeY+$homeRadius, $gelb);
   imagesetpixel($im, $homeX, $homeY, $gelb);

   imagerectangle($im, $homeX_2 -$homeRadius, $homeY_2 -$homeRadius, $homeX_2 +$homeRadius, $homeY_2 + $homeRadius, $gelb);
   imagesetpixel($im, $homeX_2, $homeY_2, $gelb);
   imagegif($im, $localImage);
}
imagedestroy($im);
?>

cam2_mod.jpg

haus_14_09_07_17_14.jpg

Schilder „Vorsicht Kamera“ haste angehauen, zumindest wenn es die Ferienwohnung betrifft :smiley:

Hi,
im Script fehlt ein

$debug=true oder false;

das wird im letzten if-Block benötigt.

Wenn du schon Bewegung erkannt hast (IR), warum benötigst du das Script dann noch? Dann kannst du ja gleich aufzeichnen.

Ich würde gern im Eingangstürbereich Bilder aufzeichnen, wenn Bewegung ist. Der IR deckt leider deutlich mehr ab.
Aber wenn das Script nicht alle 0,5-1 Sekunde laufen würde ist die Bewegung schon wieder weg ;).
Ich werde das Scripte und meinen Server mal testen.

Kann man eigentlich auch verschiedene Farben Auswertung?
http://www.dwd.de/de/WundK/Warnungen/index.htm?Land=HN00&Art=O

Ich würde gern die Warnlage in einer Variablen haben.

Hallo Ralf,

danke für den Hinweis: „$debug=true;“ muss es heißen, damit ein gelbes Rechteck gezeichnet wird.

Das u.g. Skript sollte zeigen, wie man in PHP einfache Pixel-Vergleiche realisieren kann.
z.B. Überwachung eines Parkplatzes (vorher / nachher) oder in Deinem Fall eine „Farben Auswertung“: $red = / $green = / $blue =
Für eine reine Bewegung-Erkennung ist einer Lichtschranke oder PIR sicherlich besser geeignet.
Außerdem haben die meisten Kameras eine „Motion-Detection“ schon eingebaut seihe Bild.

MST

hallo,

ausserdem sehe ich im Skript ein ‚Exit‘. Müsste das nicht ein ‚Return‘ sein ?

if(!$remoteFile || !$localFile) {
   exit; //Error erzeugen!

mfG Franz

Das stimmt bei meiner Kamera leider nicht. Das ist eine IP-Kamera, die bei jedem Abruf ein Einzelbild liefert oder mit Java oder ActiveX einen Stream.
Zur Bewegungserkennung muss die Kontrollsoftware laufen. Die benötigt aber leider sehr viel Rechenzeit.

Meine Test mit IR und einfach mal 10 Sekunden aufzeichnen haben schon einige MB erzeugt :-(.

Ich werde doch noch mal mit der Bewegungserkennung spielen, aber die Bewegung ist halt im Sekundenbereich schon fast zu langsam zu erkennen.

@ Ralf,

stimmt: die „Kontrollsoftware“ frisst bei mir auch 30% CPU Zeit

@ guyabano,

richtig: es muss: „return“ sein - es sei denn mann will bewusst eine rote Fehler-Meldung erzeugen: " //Error erzeugen! "
Hier: um zu überprüfen, ob !$remoteFile und !$localFile korrekt angegeben wurden.

MST

„unsere Software ist im Download kostenlos und unterstützt auch fremde Kameras“

mobotix downloads
Schon mal probiert?
… mir fehlt leider (noch) eine Cam zum testen