Raspberry Pi + OpenCV: розпізнавання об’єктів та сповіщення через Telegram-бот

На теренах інтернету є дуже багато крутих проектів на Raspberry Pi з використанням бібліотеки OpenCV. В даній статті я, по-суті, хочу повторити один з таких проектів по розпізнаванню об’єктів, захоплених Raspberry Pi камерою, але доповнити також це сповіщенням про появу конкретного об’єкта в кадрі через Telegram бот.

Встановлення OpenCV на Raspberry Pi

Для встановлення бібліотеки OpenCV потрібно оновити операційну систему та розширити swap:

sudo apt-get update && sudo apt-get upgrade
sudo nano /etc/dphys-swapfile

У файлі dphys-swapfile потрібно змінити значення CONF_SWAPSIZE = 100 на CONF_SWAPSIZE=2048.

sudo apt-get install build-essential cmake pkg-config

sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev

sudo apt-get install libxvidcore-dev libx264-dev

sudo apt-get install libgtk2.0-dev libgtk-3-dev

sudo apt-get install libatlas-base-dev gfortran

sudo pip3 install numpy

wget -O opencv.zip https://github.com/opencv/opencv/archive/4.4.0.zip

wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.4.0.zip

unzip opencv.zip

unzip opencv_contrib.zip

cd ~/opencv-4.4.0/

mkdir build && cd build

Якщо встановлення пакету libpng12-dev не вдасться, спробуйте libpng-dev замість нього.

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-4.4.0/modules -D BUILD_EXAMPLES=ON ..

make -j $(nproc)

Виконання останньої команди може зайняти дуже багато часу, до цього варто бути готовим. Якщо ж з якоїсь причини виникне помилка, спокійно перезапускайте команду, встановлення продовжиться з того місця, де воно зупинилося. Далі запускаємо команди:

sudo make install && sudo ldconfig

sudo reboot

На даному етапі можна величину swap назад як було CONF_SWAPSIZE = 100. Тепер потрібно завантажити файли звідси Object_Detection_Files.zip. Дані файли включають бібліотеку навчену розпізнавати об’єкти Coco Library.

Перевіряємо роботу бібліотеки розпізнавання об’єктів

Завантаживши файли Object_Detection_Files.zip потрібно їх розархівувати і перемістити у директорію /home/pi/Desktop або змінити шлях до файлів бібліотеки у python скрипті. Зокрема нас цікавить скрипт object-ident.py. Запустивши його ми побачимо щось типу такого:
cup

Налаштовування телеграм бота для Raspberry Pi

Нам потрібно відкрити свій додаток телеграм і написати в пошуку @botfather (це вбудований телеграм-бот, який дає змогу створювати нам свої кастомні боти). Далі потрібно написати /newbot, ввести назву бота і зберегти собі токен бота. Токен знадобиться нам для python-скрипта. У моєму випадку процес створення телеграм-бота вигоядав так:

itmakerclub.com create telegram bot

Python-скрипт для надсилання повідомлень з Raspberry Pi через Telegram бот

У Telegram кожен чат має ідентифікатор чату, і цей ідентифікатор нам потрібен, щоб надсилати повідомлення Telegram за допомогою Python-скрипта. Для цього потрібно надіслати нашому боту будь-яке повідомлення, а тоді запустити наступний скрипт, щоб отримати свій ідентифікатор чату:

import requests
TOKEN = "ТОКЕН НАШОГО ТЕЛЕГРАМ БОТА"
url = f"https://api.telegram.org/bot{TOKEN}/getUpdates"
print(requests.get(url).json())
telegram

Зауважте: якщо ви не надішлете своєму боту Telegram повідомлення, результати роботи скрипта можуть бути порожніми.
Скопіюйте та вставте ідентифікатор чату для наступного кроку. Скопіюйте та вставте 1) свій токен бота Telegram і 2) свій ідентифікатор чату з попередніх 2 кроків у наступний скрипт Python. (І також налаштуйте текст свого повідомлення):

import requests
TOKEN = "ТОКЕН НАШОГО ТЕЛЕГРАМ БОТА"
chat_id = "ІДЕНТИФІКАТОР ЧАТУ"
message = "Person entered the room"
url = f"https://api.telegram.org/bot{TOKEN}/sendMessage?chat_id={chat_id}&text={message}"
print(requests.get(url).json()) # this sends the message

Сповіщення про розпізнаний об’єкт через Telegram

Тепер модифікуємо скрипт object-ident.py таким чином, щоб при виявленні в кадрі людини, він надсилав про це повідомлення нам у телеграм від імені телеграм бота. Для цього додаємо в скрипт наступне (повний код можна завантажити звідси):

    isPerson = False
    while True:
        success, img = cap.read()
        result, objectInfo = getObjects(img,0.45,0.2)
        for obj in objectInfo:
          if "person" in obj:
            isPerson = True
        if isPerson:
          subprocess.run(["python", "send-message-bot.py"])
          isPerson = False
        cv2.imshow("Output",img)
        cv2.waitKey(1)

По-суті, ми просто виявляємо у python списку об’єкт person і за допомогою subprocess запускаємо скрипт, що надсилає повідомлення через телеграм бот. Даний код наведено як елементарний та досить примітивний приклад, тому модифікуйте під власні потреби 😉

Все до купи

Перевіряємо роботу нашого скрипта і отримуємо:

person

І відповідно в нашому телеграмі з’являється повідомлення:

itmakerclub.com telegram notification

Описаний тут проект заснований на компіляції кількох проектів, посилання на які, я добросовісно надаю нижче 🙂 Дякую за ваш час та буду радий коментарям стосовно вашого досвіду роботи з Raspberry Pi та OpenCV. Можливо, вам також буде цікава моя публікація про майнинг на Raspberry Pi.

raspberry-pi-opencv

Мені були корисними матеріали:
1. https://core-electronics.com.au/guides/object-identify-raspberry-pi/#Set

2. https://medium.com/codex/using-python-to-send-telegram-messages-in-3-simple-steps-419a8b5e5e2
3. https://www.w3docs.com/snippets/python/how-can-i-make-one-python-file-run-another.html

Spread the love

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *