Простий варіант системи відеоспостереження в приміщенні з використанням датчика руху і Python на платформі Raspberry

Доброго часу доби, хабровчане!
Після декількох експериментів з розробкою системи відеоспостереження, які я відобразив у попередньої публікації, вирішив поділитися підсумковим рішенням.





Опис підсумкового рішення
Проаналізувавши свій досвід використання системи відеоспостереження та рекомендації до попереднього посту (окреме спасибі Varkus), в результаті вибрав для себе реалізацію з використанням PIR-датчика (далі датчик) для визначення переміщень рухів. Алгоритм рішення реалізував на Python.

Раніше я не хотів використовувати додатковий апаратний компонент у своєму рішенні, але підхід з використанням датчика виявився дуже простим і лаконічним. Тим більше, що датчик виявився дешевшим, якщо замовити його на aliexpress.

Апаратна частина
З «заліза» використовував:
— Raspberry Pi3;
— USB-камеру Logitech
— датчик руху SR501P1.

Датчик підключив з допомогою 30-сантиметрових конекторів, зовнішній вигляд наводжу нижче.



Так, попередньо вибрав необхідну чутливість, налаштувавши його за допомогою потенціометра.

Програмна частина
Для автоматизації процесу відеоспостереження обмежився одним Python-скриптом, який виконує всю роботу, а саме — моніторить переміщення з допомогою датчика і, якщо воно виявлено:
— робить кілька знімків приміщення, використовуючи для цього бібліотеку Python OpenCV;
— зберігає знімки в Яндекс.Диску;
— по досягненні певного порогу переміщень, в моєму випадку – десять виявлених переміщень, припиняє зйомку і надсилає останній з збережених знімків в Telegram.

Поріг (threshhold) заданий для того щоб обмежити кількість знімків при фіксації переміщень. По досягненні порогу зйомка припиняється і в Telegram надсилається одне, останнє збережене фото. Я встановив поріг рівним десяти, цього достатньо, щоб зафіксувати факт проникнення на фото. Відео писати порахував зайвим, до того ж фото займає менше місця.
В кінцевому варіанті я відмовився від використання алгоритму по визначенню осіб на фото.
Код скрипта, без алгоритму по визначенню осіб, наведено нижче.

from gpiozero import MotionSensor
import cv2
import telepot
import time

def Telegram_send(input_file):
import glob
import os
file=max(glob.iglob(input_file+'*.jpg'),key=os.path.getctime)
bot = telepot.Bot('*************************************')
bot.sendMessage(*********, 'Motion detected!')
bot.sendPhoto(*********, open(file,'rb'))

def main():
file='/home/pi/сигналізація/'
counter=0
threshhold=10
pir=MotionSensor(4)
try:
camera=cv2.VideoCapture(0)
while counter<=threshhold:
if pir.motion_detected:
print("Motion detected at "+str(time.strftime("%Y - %m - %d-%H%M%S")))
if not camera.isOpened():
camera.open(0)
result,image=camera.read()
else:
result,image=camera.read()
cv2.imwrite(file+str(time.strftime("%Y - %m - %d-%H%M%S"))+'.jpg',image)
counter+=1
if counter >=threshhold: Telegram_send(file)
except as Exception e:
print('Something is wrong.',e)
camera.release()

if __name__=="__main__":
main()


«Плюси» і «мінуси» рішення з використанням датчика
Плюси використання датчика:
1. Простий підсумковий код у вигляді ОДНОГО скрипта на Python, що реалізує весь алгоритм роботи.
2. Немає необхідності в придбанні інфрачервоного фільтра/камери для роботи в нічний час.
3. Відносна дешевизна датчика.
З мінусів бачу поки тільки можливість виходу з ладу датчика при тривалій його експлуатації. Але, можливо, цей девайс (датчик) буде стабільно і довго працювати, незважаючи на те, що це не «промисловий» варіант.

Додаткові можливості
Так само я спробував підключати другу камеру. Raspberry впорався з обробкою відеопотоку з двох камер без проблем.

Висновок
Використання датчика виявилося справою зовсім нескладним. Залишилося перевірити роботу вирішення при тривалому використанні.
Сподіваюся, що запропонований варіант виявиться корисною альтернативою реалізації системи відеоспостереження, яку можна легко виконати «своїми руками».
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.