„Bilderkennung“

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

bilderk.jpg

nicht schlecht.

Dann kann ich zwar noch nicht ganz erkennen, dass sich jemand an meinem Auto auf dem Stellplatz zu schaffen macht. Aber definitiv sagen dann es einer geklaut hat! Na das ist doch mal ein Schritt in die richtige Richtung.

ja…das Script ist schon ein wenig rechenaufwendig. Ich hab im Studium damals mal ein bisschen was mit Bildverarbeitung programmiert. Auch mit Bildvergleich von Webcambildern (halt nur schneller) - da haben wir auch über eine simple Analyse von „Blobs“ Objekte detektiert. Bei schnellerer Verarbeitung war dann auch möglich die Bewegung zu erkennen und auszuwerten.
Leider bin ich da nicht so der Freak um in dem Bereich mehr zu unterstützen.

Aber der Ansatz ist doch schon mal sehr gut - da lässt sich schon ne Menge realisieren. Bin gespannt was einige aus dem Script noch basteln werden…

Wahnsinn - vielleicht schaffen wir es dann doch noch mal den Reiher am Koi-Teich zu detektieren und abzuschiessen (ja, ja nur mit Wasser :smiley: )

Gruss babba

Und das Hochdruckventil script-gesteuert mit IPS ;).