====== Оптичне розпізнавання ====== Припустимо, на нашому [[https://wolfrecorder.com/|WolfRecorder]] ведеться запис однієї з ваших камер. Нехай, на ній зображено якийсь такий пейзаж. {{:wrgenfull.png|}} Як не складно помітити, в поле зору камери потрапляють декілька амперметрів на щитовій. Припустимо, що одні з них, відображають якісь значення, за наявності міської мережі, що виглядає приблизно так: {{:wrcamgenoff.png?600|}} а інший приходить в дію та щось відображає, після заведення [[generators|генератора]], що на практиці виглядає якось так {{:wrcamgenon.png?600|}} Ви ж розумієте, що Ubilling може без проблем, на основі цих даних розпізнавати факт заведення генератора з метою автоматичного моніторингу, одним простеньким скриптиком [[onepunch|OnePunch скриптом]]? $wolfRecorderHost='yourwolfrecorderhost.ua'; // хостнейм чи IP вашого WolfRecorder $cameraChannel='camerachannelid'; // ідентифікатор каналу вашої камери $powerAvailabilityThreshold=90; // рівень яскравості сцени вище якого рахуємо, що генератор завівся $debugMode=false; // режим відлагодженя // описує координати сцени, яка буде аналізуватись $controlRegion=array( 'x1'=>1038, 'y1'=>455, 'x2'=>42, 'y2'=>25 ); $cameraScreenshotUrl='http://'.$wolfRecorderHost.'/wr/howl/chanshots/'.$cameraChannel.'.jpg'; $watchdogCallbackResult=''; $generatorState=0; $remoteHost=new OmaeUrl($cameraScreenshotUrl); $originalImage=$remoteHost->response(); if ($remoteHost->httpCode()==200 and $remoteHost->error()==false) { if (!empty($originalImage)) { $imageHash=md5($cameraScreenshotUrl.json_encode($controlRegion)); $originalImagePath='exports/'.$imageHash.'.jpg'; file_put_contents($originalImagePath, $originalImage); $powerMeter=new PixelCraft(); $powerMeter->loadImage($originalImagePath); $powerMeter->cropRegion($controlRegion['x1'], $controlRegion['y1'], $controlRegion['x2'], $controlRegion['y2']); $powerMeterColorMap=$powerMeter->getColorMap(false); $sceneBrightness=0; $pixelCount=0; foreach ($powerMeterColorMap as $y => $x) { foreach ($x as $x => $color) { $pixelCount++; $sceneBrightness+=$powerMeter->rgbToBrightness($color); } } $sceneBrightness=round($sceneBrightness/$pixelCount,2); if ($debugMode) { $previewImage=new PixelCraft(); $previewImage->loadImage($originalImagePath); $previewImage->setLineWidth(5); $regionPoints = array( $controlRegion['x1'], $controlRegion['y1'], $controlRegion['x1'] + $controlRegion['x2'], $controlRegion['y1'], $controlRegion['x1'] + $controlRegion['x2'], $controlRegion['y1'] + $controlRegion['y2'], $controlRegion['x1'], $controlRegion['y1'] + $controlRegion['y2'] ); $previewImage->drawPolygon($regionPoints, 'green'); $previewImageBase64=$previewImage->getImageBase('jpeg', true); $base64CroppedImage=$powerMeter->getImageBase('jpeg', true); $debugOutput=''; $debugOutput.='Scene brightness: '.$sceneBrightness.' Pixel count: '.$pixelCount.wf_tag('br'); $debugOutput.= wf_img_sized($base64CroppedImage, '', '200').wf_tag('br'); $debugOutput.= wf_img_sized($previewImageBase64, '', '900').wf_tag('br'); deb($debugOutput); } if ($sceneBrightness>$powerAvailabilityThreshold) { $watchdogCallbackResult='генератор здається запущений'; $generatorState=1; } else { $watchdogCallbackResult='генератор виглядає зупиненим'; } } else { $watchdogCallbackResult='ERROR: отримано порожнє зображення'; } } else { $watchdogCallbackResult='ERROR: не вдалося завантажити зображення з віддаленого хоста'; } deb($watchdogCallbackResult); Як відбувається аналіз сцени? Дуже просто. Зі сцени вирізається ось ця область, дбайливо підсвічена для візуальності в режимі відлагодження: {{:wrgenscenecropprewiew.png|}} після чого міряється її загальний рівень яскравості {{:wrgenscenecrop.png?600|}} на основі чого робиться висновок {{:wrgensceneresult.png?600|}} по швидкості, це власне займає приблизно аж стільки часу {{:wrgenscenetimers.png?600|}} Так, звичайно, ви можете вибрати будь-яку зону яка вас цікавить, наприклад $controlRegion=array( 'x1'=>937, 'y1'=>268, 'x2'=>33, 'y2'=>23 ); ось якось так: {{:wrscene220ok.png?600|}} і відповідно визначати, чи є напруга в міській мережі {{:wrscene220okcropped.png?600|}} Звичайно, ніхто не заважає вам поміряти яскравість, тільки скажімо, в червоному каналі RGB, або ж організувати якийсь більш інтелектуальний аналіз чи OCR. Це обмежено тільки тим, чи не привернете ви уваги санітарів.