понедельник, 18 ноября 2019 г.

SSOCR. Оцифровка показаний приборов

Навеяно темой про мониторинг напряжения. А что делать, если нет таких ИБП? Покупать три штуки на каждую фазу? Бред конечно. Хотя бы для зрительного контроля, установлен РН-106, или ВР-М03-1? 

Ещё с тех времен, когда техкомната не была даже зашита гипсокартоном, уже висела малинка с вебкамерой. чтобы смотреть что там происходит. А почему бы не снимать показания РН в реальном времени, и оцифровывать их в Domoticz?! Если исхитриться, то можно захватить в кадр и текущую температуру теплоносителя, которую показывает котел!

Что надо? Собственно вебкамера, направленная на щит, по возможности сфокусированная на реле с показаниями. ffmpeg, для записи снимков в формате jpg и программа ssocr для распознавания изображений.
Снимки делаю при помощи ffmpeg, на максимальном разрешении, возможном для камеры Microsoft HD3000.
ffmpeg -f video4linux2 -input_format mjpeg -video_size 1280x720 -i /dev/video0 -vframes 1 -f mjpeg /tmp/snapshot.jpeg
Далее, с ssocr пришлось вникать.
Главное - это надёжно зафиксировать камеру, чтобы изображение было максимально статично. Иначе будет сбоить ssocr  и выкидывать фокусы.
sudo apt-get update
sudo apt-get install libx11-dev
sudo apt-get install libimlib2-dev
git clone https://github.com/auerswal/ssocr.git
cd ssocr
make
Скопируем исполняемый файл
sudo cp ./ssocr /usr/local/bin/ssocr
!!! Буду разбирать весь процесс, чтобы было яснее) И ещё будут только скриншоты, чтобы ничего не копипастили в консоль. а сами набирали)
Приступаем. Исходное изображение.
Как видите, крупноватый кадр для теста)
Ок, тут понятно, вроде ругается, что нашёл только одну цифру. Укажем параметр -d -1 чтобы показал все цифры (-d, --number-digits=# number of digits in image (-1 for auto))
Хмм, 8. Что значит 8? Добавим наконец вывод отладочной информации -D, в виде файла testbild.png (да, имя выходного файла можно не указывать, testbild.png оно по-умолчанию)
Опять "8". Посмотрим наконец testbild.png
Ага, уже повеселее. Что значат эти цветные линии?
"In this image the left border of a digit is represented by a red column, the right border as a blue column. Horizontal green lines of digit width show connected vertical digit parts."
Понятно, значит всё это изображение, ssocr расценил как одну цифру, 8. Попробуем сузить область для поиска цифр при помощи параметра crop. Нам потребуются координаты начала обрезания и ширина\высота изображения. Открываем изображение через GIMP, ставим курсор на левый угол дисплея первого РН, записываем (1320*1288).
Ставим курсор на правый нижний угол третьего РН и записываем координаты (2330*1420). Теперь вычитаем от них координаты первого измерения и получаем ширину\высоту вырезанного изображения (1010*132). Duuuhhh!
Ого! Понеслась! Сколько цифр!
Теперь появилась другая проблема. Вместо 3х цифр на первом дисплее, ssocr видит одну - 8. Дальше он не может разобраться что находится между дисплеями остальных РН. Попробуем поиграть с контрастом -t (--threshold=THRESH use THRESH (in percent) to distinguish black from white). По-умолчанию эта разница установлена в 50%. Попробуем по больше, 90.
Странно, теперь видит только "-"
Нижнюю полосу видите? Вот тут он застрял. Мне потребовалось попробовать много вариантов со всеми параметрами чтобы сдвинуться с этого места. Оказалось, что по-умолчанию, передний план - черный, задний план белый. Если указать как надо, чтобы цифры ssocr увидел белыми, то всё встает на свои места!
Осталась дерзкая ".", которую можно исключить, указав выводить только цифры (-c, --charset=KEYWORD select recognized characters use -c help for list of KEYWORDS)
Ан нет, не то)) Теперь "-" превратилась в "_". Попробуем вообще игнорировать изображения, меньше 4 пикселей. Примерно на столько выглядит эта "_"
Бинго!
Теперь можно разбить это девятизначное число при помощи fold
Есть конечно у этого варианта огромный минус, если камера дернется - всё встанет.

Засунем эти показания в Domoticz. Создадим три датчика с типом Напряжение
Запишем его IDX, бла-бла-бла (см. как всё подготовить тут)
Делаем исполняемым, добавляем в крон и смотрим, как обновляется напряжение.

Комментариев нет :

Отправить комментарий