Hallo zusammen,
Für die Erkennung von Schnee hab ich mir folgendes gebastelt:
Script wird jeden Morgen um 05:30 gestartet:
- Schaltet Licht ein
- Holt Bild der Eingangskamera, scheidet interessanten Teil aus
- Berechnet Helligkeit -> setzt Variable je nach Helligkeit
- Schaltet Licht wieder aus
Je nach dem, ob jetzt Schnee liegt, werde ich etwas früher geweckt, mit dem entsprechenden Hinweis -> Schneeräumung ist wieder mal angesagt… ;-(
<?
// include_once("Utils.php"); // enthält CreateVariableByName - findet ihr im Forum
if (date("I") == 1) return; // zu Sommerzeit nicht
// ---------------------------------------------------------------------------
// Definitionen
// Kamera-Bild
$camImg = "http://192.168.170.83/SnapshotJPEG?Resolution=640x480?Quality=Standard";
// Image ist 640 x 480 Pixels (4:3)
// Definition Ausschnitt:
$fromX = 5;
$sizeX = 210;
$fromY = 360;
$sizeY = 120;
// Lightness value for snow (Range is 0.0..10.0)
$lightSnow = 4.5;
// destination variable for Snow
$destVarIdSnow = CreateVariableByName($_IPS['SELF'], "Snow", 0);
// ---------------------------------------------------------------------------
// Licht einschalten
// DoSwitch(A_LichtEingang, ON); -> eingene Routine, entsprechend zu ersetzen
// warten, bis Licht da...
IPS_Sleep(1500);
// Bild holen
$img = imagecreatefromjpeg($camImg);
// Make part
$part = imagecreatetruecolor($sizeX, $sizeY);
// copy part
imagecopy($part, $img, 0, 0, $fromX, $fromY, $sizeX, $sizeY);
// Store for Test
//imagejpeg($part, IPS_GetKernelDir() . 'tmp\\Snow.jpg');
// calculate lightness
$lightness = 0.0;
for ($x = 0 ; $x < imagesx($part) ; $x++)
{
for ($y = 0 ; $y < imagesy($part) ; $y++)
{
$c = imagecolorat($part, $x, $y);
$red = ($c >> 16) & 0xFF;
$green = ($c >> 8) & 0xFF;
$blue = $c & 0xFF;
$m = min($red, $green, $blue);
$n = max($red, $green, $blue);
/* Because RGB isn't normalized in GD, we divide by 510 here.
* Lightness = (Max(RGB) + Min(RGB)) / 2
* But that's assuming red, green, and blue are 0 through 1 inclusive.
* Red, green, and blue are actually 0-255 (255 + 255 = 510).
*/
$lightness += (double)(($m + $n) / 510.0);
}
}
$lightness = ($lightness * 10) / (imagesx($part) * imagesy($part));
// result is 0..10
if ($lightness >= $lightSnow)
{
SetValue($destVarIdSnow, true);
}
else
{
SetValue($destVarIdSnow, false);
}
// Licht wieder aus in 2 sec
// DoSwitch(A_LichtEingang, OFF, 2); -> eingene Routine, entsprechend zu ersetzen
//echo $lightness;
?>
Das gibt dann ungefähr folgende Analyse im Bild:

Funktioniert recht zuverlässig!
Gruss
Tinu