На теренах інтернету є дуже багато крутих проектів на 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. Запустивши його ми побачимо щось типу такого:
Налаштовування телеграм бота для Raspberry Pi
Нам потрібно відкрити свій додаток телеграм і написати в пошуку @botfather (це вбудований телеграм-бот, який дає змогу створювати нам свої кастомні боти). Далі потрібно написати /newbot, ввести назву бота і зберегти собі токен бота. Токен знадобиться нам для python-скрипта. У моєму випадку процес створення телеграм-бота вигоядав так:
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 повідомлення, результати роботи скрипта можуть бути порожніми.
Скопіюйте та вставте ідентифікатор чату для наступного кроку. Скопіюйте та вставте 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 запускаємо скрипт, що надсилає повідомлення через телеграм бот. Даний код наведено як елементарний та досить примітивний приклад, тому модифікуйте під власні потреби 😉
Все до купи
Перевіряємо роботу нашого скрипта і отримуємо:
І відповідно в нашому телеграмі з’являється повідомлення:
Описаний тут проект заснований на компіляції кількох проектів, посилання на які, я добросовісно надаю нижче 🙂 Дякую за ваш час та буду радий коментарям стосовно вашого досвіду роботи з Raspberry Pi та OpenCV. Можливо, вам також буде цікава моя публікація про майнинг на Raspberry Pi.
Мені були корисними матеріали:
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