Простой вариант системы видеонаблюдения в помещении с использованием датчика движения и Python на платформе Raspberry

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

1d8b0e12c41549769972f78c8fa2427f.jpg

Описание итогового решения


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

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

Аппаратная часть


Из «железа» использовал:
 — Raspberry Pi3;
 — USB-камеру Logitech
 — датчик движения SR501P1.

Датчик подключил с помощью 30-и сантиметровых коннекторов, внешний вид привожу ниже.

2c2ed209df074d9e95f1d0a372d12b67.JPG

Да, предварительно выбрал необходимую чувствительность, настроив его с помощью потенциометра.

Программная часть


Для автоматизации процесса видеонаблюдения ограничился одним 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/alarms/'
 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 Exception as e:
  print('Something is wrong.',e)
  camera.release()

if __name__=="__main__":
 main()

«Плюсы» и «минусы» решения с использованием датчика


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

Дополнительные возможности


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

Заключение


Использование датчика оказалось делом совсем несложным. Осталось проверить работу решения при длительном использовании.
Надеюсь, что предложенный вариант окажется полезной альтернативой реализации системы видеонаблюдения, которую можно легко выполнить «своими руками».

Комментарии (9)

  • 25 января 2017 в 21:30

    0

    Отлично, коротко и понятно.
    • 25 января 2017 в 23:14

      0

      Спасибо.
    • 25 января 2017 в 23:20 (комментарий был изменён)

      0

      Спасибо.
  • 25 января 2017 в 21:32

    0

    Интересно было бы взглянуть на фото с камеры во время проникновения.

  • 25 января 2017 в 21:35

    0

    Чем плох motion? Он может и видео по движению записывать, и картинки сохранять и датчика не требует.
    http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome
    • 25 января 2017 в 21:39

      0

      Я уже отвечал на этот вопрос в комментариях к предыдущей публикации. Motion, разумеется, неплохое решение, однако, я не смог с ним реализовать отправку сообщения в Telegram. Telegram мне нужен для оперативной реакции.
      Альтернативный вариант, который я предложил, очень прост, на мой взгляд, и не требует сохранения видео, которое может занять значительный объем.
      • 25 января 2017 в 22:55

        0

        Motion может не сохранять видео, и там есть External Commands http://www.lavrsen.dk/foswiki/bin/view/Motion/ExternalCommands

        Почем не вышло их использовать?

        • 25 января 2017 в 23:22

          0

          Ниже комментарий из моего предыдущего поста.
          Добавлю так же что motion это, на мой взгляд, еще не зрелое решение и что будет с его развитием — не понятно. Для меня он остался «черным ящиком». Мое же решение очень простое и открытое.
           — Попытался использовать user scripts в motion. Оказалось, что это не очень просто.
          Вроде все корректно настроил — в motion.conf указал необходимые настройки.
          Изменил пользователя для файлов скриптов, дал права на исполнение скриптов (пробовал как python, так и shell-скрипты).
          Пока ничего не получилось. При этом сохранение отдельных файлов и видео при обнаружении движения работает. Все сохраняется в target_dir.
          Замечу, что не у одного меня возникли с этим проблемы. Ниже приведен перечень вопросов/проблем, с которыми сталкиваются пользователи motion.
          Многие вопросы остаются нерешенными… Возможно, продукт еще достаточно «молодой» и много изменений, связанных с его развитием.
          Все рекомендации, указанные в ответах на вопросы ниже я попробовал (в т.ч. анализ логов motion). Пока безрезультатно.
          Даже echo с выводом в файл, расположенный в target_dir, не работает. motion в target_dir успешно пишет файлы и видео.

          http://stackoverflow.com/questions/35469118/how-can-i-use-the-on-motion-detected-method-on-raspberry-pi-motion
          http://raspberrypi.stackexchange.com/questions/8273/running-script-in-motion
          http://unix.stackexchange.com/questions/59091/problems-running-python-script-from-motion
          https://www.raspberrypi.org/forums/viewtopic.php? t=86534&p=610482
          https://sourceforge.net/p/motion/mailman/message/33153769/

  • 25 января 2017 в 23:30

    0

    Подскажите, а датчик движения работает в режиме прерывания или опрашиваете изменение в цикле?

    Недавно публиковал похожее по функционалу решение «Сигнализация для холодильника. Не жизнь, а «малина» c RaspberryPi 3», но использовал геркон и camel компоненты для публикации…

© Habrahabr.ru