[Железо] Считываем показания с газового счетчика оптическим методом (через камеру)

Работа с конкретным оборудованием

Модераторы: immortal, newz20

Ответить
stellhawk
Сообщения: 264
Зарегистрирован: Чт ноя 08, 2018 5:51 am
Благодарил (а): 10 раз
Поблагодарили: 83 раза

[Железо] Считываем показания с газового счетчика оптическим методом (через камеру)

Сообщение stellhawk » Вс ноя 25, 2018 11:25 am

так сложилось что у меня в доме есть газовый счетчик без импульсного выхода и постоянное хождение и фотканье его меня задолбало - озаботился я вопросом автоматического съема показаний.
как раз у меня без дела осталась валяться старая ip камера trendnet TV-501.
решил, что если даже не распознаю, то база снимков останется - уже хлеб.
с камеры забираю фотки по crontab

Код: Выделить всё

wget --user=admin --password='admin' -U "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/
3.5.5" "http://192.168.220.46/IMAGE.JPG" -O "/var/www/html/gaz/gaz.$(date +%Y-%m-%d.%H.%M.%S).jpg"
сначала я нашел статью на ab-log, но она мне не помогла нисколько -отсутствие какого-либо дебага, мне не позволяло понять что куда и зачем.
нашел на хабре статью https://habr.com/post/220869/ - решил поковырять
СпойлерПоказать
потом еще нашел вот это - если тема устройств для распознавания интересна еще есть вот такая тема: https://habr.com/post/409829/
описание моих страданий тут:
СпойлерПоказать
Статья на писанная на хабре сильно помогла, но учитывая что питон я не знаю особо - было много багов, которые победить было не просто.
Приходилось все те части что мне не нравились отключать и смотреть что будет, слава богу автор в нужных местах оставил закомментированные места с выводом полученной картинки -ищем cv2.imshow....
у меня нет визуальной оболочки поэтому, я сохранял картинки в тех местах где был вывод и смотрел что на выходе через браузер
cv2.imwrite(os.path.join('/var/www/html/1/1/waka.jpg'), img)
В итоге пришлось отключить все супернавороты от авторам с автораспознованием места циферблата.
Скрипт стал более тупой, но не менее полезный.
Важно!! фотки сделанные с рук не подойдут потому что место начало распознавания будет разное. а тут требуется стабильность
в прикрепленным архиве всё что нужно для запуска и понимая процесса.
там сразу имеется мои фотки и база этих картинок для упрощения понимая.
(прежде чем начать реальную работу надо удалить db/images.db и все файлы в папке фото.
В системе два исполняемых файла:
src/gaz-counter-recognizer.py -скрипт который открывает картинки и пытается их распознать
src/web.py -веб сервер на 5001 порту для ручного внесения нераспознанных знаков и отображения результата.
СпойлерПоказать
db/ -папка с базой распознанных картинок
photo/ -папка откуда скрипт читает файлы для распознавания (лучше если это будет симлинк на папку gaz/ на вебсервере)
web/ - содержимое папки надо загрузить в корень веб сервера.
usr/lib/systemd/system/gaz-counter.service -сервис если мы хотим чтобы web.py работал постоянно.
src/templates/recognize.html -необходимо изменить пусть до картинок на Ваш путь(http://192.168.220.100/gaz/)
src/models.py - ищем слово waka и там меняем строку на путь к вашему вебсерверу.
Как этим пользоваться:
1. удаляем все картинки из фото и файл базы.
2. Открываем полученную со своей камеры картинку
gaz.2018-11-24.11.05.01.jpg
gaz.2018-11-24.11.05.01.jpg (25.67 КБ) 4967 просмотров
в paint и определяем координаты части которая содержит необходимые к распознаванию символы пример:
waka.jpg
waka.jpg (3.54 КБ) 4967 просмотров
прям сильно точно не нужно, достаточно чтобы не было много лишнего мусора и картинка равномерно делилась на 8 частей.
в файле models.py функция extractDigitsFromImage() строка 167: img=img[260:293,140:370]
в ней указываем необходимые значения
для того чтобы точно определить место картинки дописывает в код sys.exit() перед строкой return True (170)
получившуюся после обрезания картинку можно посмотреть тут:/var/www/html/gaz/1/waka.jpg
в строке 165:M = cv2.getRotationMatrix2D((w/2,h/2),0.999,1) идет изменение наклона картинки, изменяя число 0.999 нужно добиться,чтобы цифры на выходе было в одну линию -т.е. не был отрезан ни низ ни верх.
когда на выходе мы получим что-то похожее на
waka.jpg
waka.jpg (3.54 КБ) 4967 просмотров
убираем из кода sys.exit()
далее идем в функцию splitDigits
в ней есть cv2.imwrite(os.path.join('/var/www/html/gaz/1/wakaa'+str(i)+'.jpg'), digit_bin)
это мы записываем картинки с каждой отдельной цифрой.
в конце этой функции перед return True пишем return True
запускаем скрипт и для теста всё хорошо или нет у нас есть файл http://192.168.220.100/gaz/1.html
он отображает сверху картинку с цифрами а ниже картинки цифр -если все цифры стоят в отдельных картинках хорошо, то настройку можно считать законченной.

3. далее желательно добавить 3-4 картинки для распознавания, и запускаем скрипт src/gaz-counter-recognizer.py. скрипт вылелит с ошибкой, но это нам и нужно.
запускаем src/web.py - откроется станица на ей будет написано нераспознаных показаний: - > идем по ссылки и вводим все цифры которые видим - это происходит обучение алгоритма распознавания.в дальнейшем алгоритм будет опираться на эти картинки и принимать решения на основе этих данных.
Всё шаманство закончилось -далее ошибок быть не должно

добавляем по 3-5 картинок в распознавание и продолжаем обучение алгоритма. по моему опыту через день снятия показаний количество нераспознанных символов уже не более 5 процентов, а дня через 3-4 -одни-два символа на сутки показаний.

4. Можно добавить станицу с показания к нашему MD.
Идем в панель управления ->Настройки - Домашние страницы.
+новая страница ->название произвольное , тип URL ->Добавить
После появится поле ссылка куда прописываем свою ссылку на Газ.(у меня это http://192.168.220.100:5001/)
для того чтобы веб панелька постоянно работала приложил usr/lib/systemd/system/gaz-counter.service его нужно поправить по путям до файлов и положить в /usr/lib/systemd/system/gaz-counter.service
далее systemctl enable gaz-counter && systemctl start gaz-counter

На выходе вот такая красота:
2018-11-25_15-25-09.png
2018-11-25_15-25-09.png (74.29 КБ) 4967 просмотров

система обучения:
2018-11-25_15-31-39.png
2018-11-25_15-31-39.png (8.89 КБ) 4963 просмотра
где цифра не понятно смотрим с изначальной картинки и забиваетм.
вписываем правильное показание.
там где на картинках цифра видна плохо - галочку не ставим - галочка означает признак использовать в обучении эту картинку или нет.
Вложения
gaz-counter.zip
(1.33 МБ) 257 скачиваний
За это сообщение автора stellhawk поблагодарили (всего 8):
cheetah (Ср ноя 28, 2018 3:24 pm) • xor (Чт ноя 29, 2018 1:34 am) • lanket (Вт дек 04, 2018 5:43 pm) • ypiter2006 (Пт дек 14, 2018 2:32 pm) • iTango (Пн дек 17, 2018 12:36 pm) • directman66 (Сб дек 07, 2019 12:02 pm) • TrDA (Вс дек 08, 2019 7:23 pm) • AndreyAA (Вс окт 25, 2020 1:39 pm)
Рейтинг: 9.3%
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

Re: [Железо] Считываем показания с газового счетчика оптическим методом (через камеру)

Сообщение directman66 » Сб дек 07, 2019 12:03 pm

В ввиду последних событий поддержки pyhon из коробки, интересно бы с сделать этот функционал в виде модуля для установки из маркета.
За это сообщение автора directman66 поблагодарил:
mer (Сб янв 04, 2020 2:34 am)
Рейтинг: 1.16%
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
Аватара пользователя
mab
Сообщения: 46
Зарегистрирован: Сб янв 19, 2019 1:26 am
Благодарил (а): 5 раз
Поблагодарили: 9 раз

Re: [Железо] Считываем показания с газового счетчика оптическим методом (через камеру)

Сообщение mab » Вс май 31, 2020 10:41 am

собираю таким образом показания с 2х счётчиков, вода и газ.. работает!
Ответить