Hallo zusammen,
so, gestern Abend noch experimentiert.
Mit dem Helligkeit und Contrast anpassen etc, war das nicht zuverlässig.
Ich habe mit Netz aber was gefunden, was einen guten Weg zum Vergleich von Bildern beschreibt.
Darauf hin habe ich mir eine PHP Klasse geschrieben.
Die funktioniert bisher SEHR gut, da Helligkeit und Farbänderungen der Bilder keine Rolle spielen!
Vorab habe ich natürlich nur die Ausschnitte des Webcam Bilds gezoen, die überwacht werden müssen.
Hier mal ein paar Bilder mit Beispielen:
Beispiel der Berlin Webcam:
Original:
Original und 64 Pixel Vergleich:
![diff2.jpg](https://community.symcon.de/uploads/default/original/2X/9/95a862d7380c379399b4b8f8ab22efee337309b3.jpeg)
vergrößertes Delta Bild
![berlin_delta.jpg](https://community.symcon.de/uploads/default/original/2X/1/1b1601f3625961b68fff89f5f7f66310f9975481.jpeg)
Skilift:
![imageDiff.jpg](https://community.symcon.de/uploads/default/original/2X/2/20c8e2c18f513df373ffac4d1897412dacb0f0ee.jpeg)
Und Hier mal Delta mit viel Nebel:
![Bahn_delta.jpg](https://community.symcon.de/uploads/default/original/2X/9/99d6fa57ac5ea0d98a5bb8fa71fa91c0e5310361.jpeg)
<?php
/* ImageDiff --------------------------------------------
Class to identify difference between two images.
Difference is identified in comparing the delta between average color.
Based on idea from:
http://www.hackerfactor.com/blog/?/archives/432-Looks-Like-It.html
call function Diff to get an Array with the results
Diff Description:
Array Diff( string $im1, string $im2 [, boolean $save[, integer $size]] ):
$im1: Path to first file
$im2: Path to second file
$save: Saves the compare images in the same folder than the soruce file1
details are returned back in the array.
$size: defines the resize image size which is used to compare.
default is 16 pixels, Higher = more Detail, but slower
Example:
$clIM = new ImageDiff;
$ret = clIM->Diff("./images/image1.jpg","./images/image2.jpg", true)
print_r($ret);
*/
class ImageDiff{
public $dbg = false;
public function Diff($im1, $im2, $save=false, $size=16 ){
// $im1, $im2 = path to two images
// $size default 8, resize size for delta processing
// $save default. saves the resized images (), same target as src with prefix sized_
$dbg = $this->dbg;
// Vergleichsbilder erzeugen Nr. 1
$i1 = imagecreatefromjpeg($im1);
list($width1, $height1) = getimagesize($im1);
$id1 = imagecreatetruecolor($size, $size);
imagecopyresized($id1, $i1, 0, 0, 0, 0, $size,$size, $width1, $height1);
imagefilter($id1,IMG_FILTER_GRAYSCALE);
// Vergleichsbilder erzeugen Nr. 2
$i2 = imagecreatefromjpeg($im2);
list($width2, $height2) = getimagesize($im2);
$id2 = imagecreatetruecolor($size, $size);
imagecopyresized($id2, $i2, 0, 0, 0, 0, $size,$size, $width2, $height2);
imagefilter($id2,IMG_FILTER_GRAYSCALE);
// Nun Pixel
$i1_avg = $this->average($id1);
$i2_avg = $this->average($id2);
//Compute Hash
$i1_hash = $this->ComputeHash($id1,$i1_avg);
if($dbg) echo "Hash Bild 1 : ".implode($i1_hash)." <br>";
$i2_hash = $this->ComputeHash($id2,$i2_avg);
if($dbg) echo "Hash Bild 2 : ".implode($i2_hash)." <br>";
// Count Distance:
$fail = 0;
for($x=0;$x < count($i2_hash);$x++){
if($i2_hash[$x] != $i1_hash[$x]){
$fail++;
}
}
$delta = ($fail / ($size*$size))*100;
if($save){
// Create Delta image
$id3 = imagecreatetruecolor($size, $size);
imagecopy($id3, $id1,0,0,0,0,$size,$size);
$col =imagecolorallocate( $id3 , 0 , 255 , 0);
$x=$y=0;
$cnt=0;
for($y=0; $y < $size; $y++){
for($x=0; $x < $size; $x++){
if($i2_hash[$cnt] != $i1_hash[$cnt]){
imagesetpixel($id3, $x, $y,$col);
}
$cnt++;
}
}
$fndelta = pathinfo($im1, PATHINFO_DIRNAME)."/delta_".basename($im1);
imagejpeg($id3,$fndelta);
imagedestroy($id3);
$ret["deltaimage"]= $fndelta;
// Save temporary images
$fn1 = pathinfo($im1, PATHINFO_DIRNAME)."/sized_".basename($im1);
$fn2 = pathinfo($im2, PATHINFO_DIRNAME)."/sized_".basename($im2);
imagejpeg($id1,$fn1);
imagejpeg($id2,$fn2);
imagedestroy($id1);
imagedestroy($id2);
$ret["tempimg1"] = $fn1;
$ret["tempimg2"] = $fn2;
}
$ret["delta"]= $delta;
return $ret;
}
private function ComputeHash($img, $avg = 100){
global $dbg;
$w = imagesx($img);
$h = imagesy($img);
$r = $g = $b = 0;
for($y = 0; $y < $h; $y++) {
for($x = 0; $x < $w; $x++) {
$rgb = imagecolorat($img, $x, $y);
$r = $rgb >> 16;
if($r <= $avg){
$hash [] ="1";
} else {
$hash [] ="0";
}
}
}
return $hash;
}
private function average($img) {
$w = imagesx($img);
$h = imagesy($img);
$r = $g = $b = 0;
for($y = 0; $y < $h; $y++) {
for($x = 0; $x < $w; $x++) {
$rgb = imagecolorat($img, $x, $y);
$r += $rgb >> 16;
//$g += $rgb >> 8 & 255;
//$b += $rgb & 255;
}
}
$pxls = $w * $h;
//$r = (round($r / $pxls));
//$g = (round($g / $pxls));
$r = (round($r / $pxls)); // Da wir graustufen verwenden reicht eine Farbe
//return $r ."," . $g .",". $b;
if($r < 10 )$r=0; // Wenn fast Schwarz, dann schwarz!
if($r > 245 )$r=255; // auch mit Weiß so verfahren.
return $r;
}
}
?>
Auf diese einfache Art kann man dann jede beliebige Webcam mit URL monitoren.
Man muss nur noch per Timer alle paar Minuten ein Bild laden und speichern, dann dieser Klasse übergeben und man erhält das Delta.