Користувальницькькі налаштування

Налаштування сайту


wroptrecogmeters

Розбіжності

Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.

Посилання на цей список змін

Наступна ревізія
Попередня ревізія
wroptrecogmeters [2025/12/09 20:07]
nightfly створено
wroptrecogmeters [2025/12/11 00:50] (поточний)
nightfly
Рядок 1: Рядок 1:
 ====== Оптичне розпізнавання ====== ====== Оптичне розпізнавання ======
  
-Припустимо, на нашому [[https://wolfrecorder.com/|WolfRecorder]] ведеться запис однієї з наших камер. Нехай, на ній зображено якийсь такий пейзаж. +Припустимо, на нашому [[https://wolfrecorder.com/|WolfRecorder]] ведеться запис однієї з ваших камер. Нехай, на ній зображено якийсь такий пейзаж. 
  
 {{:wrgenfull.png|}} {{:wrgenfull.png|}}
  
-Як не складно помітити, в поле зору камери потрапляють декілька амперметрів на щитовій. Припустимо, що одні з них, відображають якісь значення, за наявності міської мережі, що виглядає приблизно так+Як не складно помітити, в поле зору камери потрапляють декілька амперметрів на щитовій. Припустимо, що одні з них, відображають якісь значення, за наявності міської мережі, що виглядає приблизно так:
  
 +{{:wrcamgenoff.png?600|}}
  
-{{:wrcamgenoff.png|}} 
  
-а інші приходить в дію, після заведення генератора, що на практиці виглядає якось так+а інший приходить в дію та щось відображає, після заведення [[generators|генератора]], що на практиці виглядає якось так
  
-{{:wrcamgenon.png|}}+{{:wrcamgenon.png?600|}}
  
 +Ви ж розумієте, що Ubilling може без проблем, на основі цих даних розпізнавати факт заведення генератора з метою автоматичного моніторингу, одним простеньким скриптиком [[onepunch|OnePunch скриптом]]?
  
 +<code php>
 +    $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);
 +</code>
 +
 +Як відбувається аналіз сцени? Дуже просто. Зі сцени вирізається ось ця область, дбайливо підсвічена для візуальності в режимі відлагодження:
 +
 +{{:wrgenscenecropprewiew.png|}}
 +
 +
 +після чого міряється її загальний рівень яскравості
 +
 +{{:wrgenscenecrop.png?600|}}
 +
 +на основі чого робиться висновок
 +
 +{{:wrgensceneresult.png?600|}}
 +
 +по швидкості, це власне займає приблизно аж стільки часу
 +
 +{{:wrgenscenetimers.png?600|}}
 +
 +Так, звичайно, ви можете вибрати будь-яку зону яка вас цікавить, наприклад
 +
 +<code php>
 +    $controlRegion=array(
 +        'x1'=>937,
 +        'y1'=>268,
 +        'x2'=>33,
 +        'y2'=>23
 +    );
 +</code>
 +
 +ось якось так:
 +
 +{{:wrscene220ok.png?600|}}
 +
 +і відповідно визначати, чи є напруга в міській мережі
 +
 +{{:wrscene220okcropped.png?600|}}
 +
 +Звичайно, ніхто не заважає вам поміряти яскравість, тільки скажімо, в червоному каналі RGB, або ж організувати якийсь більш інтелектуальний аналіз чи OCR. Це обмежено тільки тим, чи не привернете ви уваги санітарів. 
wroptrecogmeters.1765303656.txt.gz · Востаннє змінено: 2025/12/09 20:07 повз nightfly