… 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);
?>