Ich habe das Skript der „Unwetterzentrale“etwas modifiziert, um zu „erkennen“ ob sich Objekte in einem Bild verändert haben.
So kann z.B. ein Parkplatz oder eine Vitrine mit Hilfe einer Web-Kamera überwacht werden.
Es ist nicht dazu geeignet eine Bewegung zu erkennen!!!
Über Ideen und Anregungen würde ich mich freuen.
MST
Zur Info:
Das Skript wird z.B. alles 60 sec ausgeführt (Achtung: es kostet CPU-Zeit!)
Der zu überwachende Bereich wird mit:
homeX = 580;
$homeY = 160;
$homeRadius = 5; ausgewählt
Die Empfindlichkeit wird hiermit eingestellt: $offset = 20
Die bettreffende Datei liegt hier: $remoteImage = IPS_GetKernelDir()."\web\labor.jpg";
Es werden die RGB-Werte aufsummiert und somit der „Grau-Wert“ ermittelt und abgespeichert: „WebCam_gray_old“
Anschließend erfolgt ein alt/neu Vergleich – fertig – also nicht spektakuläres.
Es läßt sich viel verbessern …
<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : WebCam_Bewegung.ips.php
Trigger :
Interval : 60 Sekunden
*/
//Einstellungen in px - Oben-Links ist 0,0
$homeX = 580;
$homeY = 160;
$homeRadius = 5;
$offset = 20; // 0 bis 255 Helligkeit / Alamrschwelle
//Zum testen der X,Y,Radion Angaben auf true setzen und Bild hinerher angucken
//$debug= False;
$debug = True;
$remoteImage = IPS_GetKernelDir()."\\web\labor.jpg";
$localImage = IPS_GetKernelDir()."\\web\abor_mod.jpg";
$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);
$grayold = GetValueInteger("WebCam_gray_old"); // Wert "holen"
$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;
$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;
echo "Rot : $red
";
echo "Rot_Summe : $red_sum
";
echo "Rot_Mittel : $red_mittel
";
echo "Grün : $green
";
echo "Grün_Summe : $green_sum
";
echo "Grüen_Mittel : $green_mittel
";
echo "Blau : $blue
";
echo "Blau_Summe : $blue_sum
";
echo "Blau_Mittel : $blue_mittel
";
echo "Pixel : $pixel
";
echo "Grau-Wert : $gray
";
$gray = (int)$gray;
SetValueInteger("WebCam_gray_old", $gray); // Wert "merken"
if (($gray > $grayold + $offset) or ($gray < $grayold - $offset)){
echo "Bewegung erkannt";
include(IPS_GetScriptFile("Doorbell"));
DXMedia_Open(62704, "d:/daten/sounds/alarm_webmove.wav");
DXMedia_SetVolume(62704, 50);
DXMedia_Play(62704);
}
if($debug) {
$schwarz = ImageColorAllocate ($im, 0, 0, 0);
$rot = ImageColorAllocate ($im, 255, 0, 0);
imagerectangle($im, $homeX-$homeRadius, $homeY-$homeRadius, $homeX+$homeRadius, $homeY+$homeRadius, $rot);
imagesetpixel($im, $homeX, $homeY, $rot);
imagegif($im, $localImage);
}
imagedestroy($im);
?>