Imagecolorat für Hell/Dunkelauswertung

Hallo zusamen,

Ich habe an der Haustür eine (günstige) Kamera. Durch die weisse Hauswand bekommt sie scheinbar die Blende nicht vernünftig geregelt und das Bild ist sehr dunkel. Wenn man Ihr dann kurz den Strom klaut, ist das Bild wieder wunderbar.

Als ich dann den Beitrag:

http://www.ipsymcon.de/forum/showthread.php?t=3108

las, kam mir die Idee, die Kamera damit abzufragen. Ich habe eine FS20 Steckdose zwischen gehangen und los gelegt. Leider merkte ich sehr schnell, dass ich den Sinn/Zusammenhang der Befehle Imagecolorat() und Imagecolorresolve() aus dem o.g. Skript nicht verstehe.

Kann mir hierzu einer vieleicht kurz einen Tip geben, der mich wieder auf den richtigen Weg bringt? Oder bekomme ich so nur eine bestimmte Farbe raus, und nicht, ob das Bild insgesamt sehr dunkel ist?

Gruß Marcel

Schau doch mal in die Bedienungsanleitung für imagecolorat. Da ist das eigentlich ganz gut beschrieben.

Das andere ist ein Farbabgleich. Es gibt hunderte verschiedene Weißtöne. So sieht deine Hauswand bei Regenwetter wohl anders aus als bei Sonne oder bei bedecktem Himmel, Dämmerung oder Schatten. Und wenn du nun prüfst ob ein bestimmtes weiß zu sehen ist wirst du sehr oft „Nein“ als Antwort bekommen und die Kamera würde wohl ständig neu gestartet.

Gruß,

Toni

Die „Bedienungsanleitung“ auf php.net hat mich nicht viel weiter gebracht und geht in die selbe Richtung. Wenn ich das Skript von Steiner so wie in Deinem Link vorgeschlagen ändere, bekomme ich noch immer keine vernünftigen RGB Werte?

Ich wollte auch nicht nach den weißtönen suchen, sondern, ob das Bild sehr dunkel (fast schwarz) ist. Wenn die Blende versagt, kann man auf dem Bild nichts mehr erkennen.

So wie ich das verstanden habe, wird bei o.g. Script nach vorher definierten Farben gesucht. Ich bräuchte aber wohl eher eine Möglichkeit, den Farbwert eines jeden Pixels auszugeben, um mir daraus einen Durchschnittswert zu bilden und raus zu finden, ob das Bild insgesammt dunkel ist.

Gruß Marcel

zum Spielen mit Farb- u. Grautönen:


//Einstellungen in px - Oben-Links ist 0,0
$homeX = 470;  // 470 g  / b 350 / 230 / 110
$homeY = 350;  // 160
$homeRadius = 50;
$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()."webcam_snapshot.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);

$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;
      $gray_pix = ($red + $green + $blue) /3;
      $red_sum = $red_sum + $red;
      $green_sum = $green_sum + $green;
      $blue_sum = $blue_sum + $blue;
      $pixel = $pixel +1;
      
      if($gray_pix > 254) {
         //imagerectangle($im, $homeX-$homeRadius, $homeY-$homeRadius, $homeX+$homeRadius, $homeY+$homeRadius, $rot);
         imagesetpixel($im, $x, $y, $blau);
        // imagegif($im, $localImage);
}
   }
}

$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
";

$schwelle = 5;
SetValueInteger("WebCam_Color_Detect", 0);
if(($red_mittel > $green_mittel + $schwelle) and ($red_sum > $blue_mittel + $schwelle)) {
   SetValueInteger("WebCam_Color_Detect", 1);
}
if(($green_mittel > $red_mittel+ $schwelle) and ($green_mittel > $blue_mittel + $schwelle)) {
   SetValueInteger("WebCam_Color_Detect", 2);
}
if(($blue_mittel > $red_mittel+ $schwelle) and ($blue_mittel > $green_mittel + $schwelle)) {
   SetValueInteger("WebCam_Color_Detect", 3);
}

$gray = (int)$gray;
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);
   imagegif($im, $localImage);
}
imagedestroy($im);

Okay, aber es gibt ebensoviele Grautöne wie weißtöne… Das Problem ist das gleiche :wink:

Danke, ich denke, jetzt komme ich weiter!