Видеонаблюдение на Raspberry Pi

Доброе время суток!

В предновогоднюю ночь у меня возникла идея соорудить некое подобие видеонаблюдения. Все необходимое у меня имелось на руках:
  • Одноплатный компьютер Raspberry Pi Model B
  • Web-камера LOGITECH HD Webcam C270

Прочитав статью я решил немного развить идею автора.

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

Знакомство

Итак, для начала познакомимся c главным «компонентом»:
Внешний вид Raspberry Pi:

Характеристики:
  • Broadcom BCM2835 700MHz ARM1176JZFS processor with FPU and Videocore 4 GPU
  • GPU provides Open GL ES 2.0, hardware-accelerated OpenVG, and 1080p30 H.264 high-profile decode
  • GPU is capable of 1Gpixel/s, 1.5Gtexel/s or 24GFLOPs with texture filtering and DMA infrastructure
  • 512MB RAM
  • Boots from SD card, running a version of the Linux operating system
  • 10/100 BaseT Ethernet socket
  • HDMI video out socket
  • 2 x USB 2.0 sockets
  • RCA composite video out socket
  • SD card socket
  • Powered from microUSB socket
  • 3.5mm audio out jack
  • Raspberry Pi HD video camera connector
  • Size: 85.6 x 53.98 x 17mm"

pi@hall-pi ~ $ cat /proc/cpuinfo
processor       : 0
model name      : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS        : 2.00
Features        : swp half thumb fastmult vfp edsp java tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xb76
CPU revision    : 7

Hardware        : BCM2708
Revision        : 000e
Serial          : 000000005a82c372


Список официально поддерживаемых дистрибутивов можно найти тут. Я же остановил свой выбор на Raspbian без графической оболочки.

Процесс установки достаточно прост и не нуждается в подробном описании, поэтому перечислю основные факты, на которые стоит обратить внимание:
  1. Настройка часового пояса
  2. Настройка имени компьютера
  3. Включение доступа по SSH
  4. Обновление системы

После выполнения всех необходимых настроек можно приступать.

Подготовка

Для начала выполним установку всех необходимых пакетов:
sudo apt-get install imagemagick libav-tools libjpeg8-dev subversion

После чего скачаем и соберем mjpg-streamer:
sudo svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer/ mjpg-streamer
cd mjpg-streamer
make

Т.к. у нас все данные будут храниться в облаке, настроим работу с удаленной файловой системой по WebDAV:
sudo apt-get install davfs2
sudo mkdir /mnt/dav
sudo mount -t davfs https://webdav.yandex.ru /mnt/dav -o uid=pi,gid=pi

Для того, чтобы не вводить каждый раз имя пользователя и пароль, нужно добавить их в файл
/etc/davfs2/secrets
/mnt/dav                        user password


Рабочий процесс

Добавим в /etc/rc.local команды для монтирования WebDAV и запуска скрипта для трансляции в сеть:
mount -t davfs https://webdav.yandex.ru /mnt/dav -o uid=pi,gid=pi
cd /home/pi/mjpg-streamer && ./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"

Теперь, зайдя по адресу http://:8080/ мы получим доступ к камере. Осталось только сделать проброс порта на роутере и можно получить доступ к камере за пределами локальной сети.

Создание timelapse видео

Первым делом нам надо получить изображение с камеры. Т.к. она уже занята (изображение транслируется веб-сервером), то воспользуемся возможностью получения текущей картинки с веб-сервера:
curl http://localhost:8080/?action=snapshot > out.jpg

В случае, если мы хотим нарисовать дату снимка на изображение, то мы можем воспользоваться командой convert
timestamp=`stat -c %y out.jpg`
convert out.jpg -fill black -fill white -pointsize 15 -draw  "text 5,15 '${timestamp:0:19}'" out_.jpg

Полная версия скрипта:
#!/bin/bash

filename=$(perl -e "print time")
foldername=$(date --rfc-3339=date)

curl http://localhost:8080/?action=snapshot > $filename
timestamp=`stat -c %y $filename`

mkdir /mnt/dav/out/$foldername

convert $filename -fill black -fill white -pointsize 15 -draw  "text 5,15 '${timestamp:0:19}'" /mnt/dav/out/$foldername/$filename.jpg

rm $filename

Сборка видео осуществляется командой avconv:
avconv -r 10 -i %06d.jpg -r 10 -vcodec mjpeg -qscale 1   out.avi

Полная версия скрипта сборки видео:
#!/bin/bash

filename=$(date --rfc-3339=date)

i=0
for f in `ls -tr /mnt/dav/out/$filename/*.jpg 2>/dev/null`
do
  newf=`printf %06d $i`.jpg
  echo $f "-->" $newf
  mv $f $newf
  i=$((i+1))
done
rmdir -R /mnt/dav/out/$filename/
avconv -r 10 -i %06d.jpg -r 10 -vcodec mjpeg -qscale 1   /mnt/dav/$filename.avi
rm *.jpg

Теперь осталось только прописать выполнение скриптов в планировщике Cron:
* *   * * *   pi      bash /home/pi/cam.sh
59 23   * * *   pi      bash /home/pi/build.sh


Пример видео



Заключение

Данный подход помогает избавиться от необходимости траты большого количества времени на просмотр видео, а так-же удешевляет конечный продукт. Благодаря присутствию полноценной ОС, появляется возможность расширять функционал в нужном направлении.

P.S. К сожалению опубликовать в хабы «DIY или Сделай Сам, Железо, Гаджеты. Устройства для гиков» не хватило кармы, выбрал наиболее близко доступное.
Поделиться публикацией
Ммм, длинные выходные!
Самое время просмотреть заказы на Фрилансим.
Мне повезёт!
Реклама
Комментарии 23
  • +6
    Использовал для этих целей motion. Он умеет и видео писать, и фотки щёлкать и в web вещать, и всё это одновременно.
    • 0
      Спасибо, надо будет попробовать.
      При наличии фантазии можно и в моем случае реализовать данный функционал — дело времени и желания.
      • 0
        Также использую motion на Rpi. Использую из-за наличия функции детектирования движения с автоматической отсылкой письма на почту.
        • 0
          Кхм, с включенным motion detection отъедает порядка 30% процессора на двухъядерном AMD E-350. Боюсь представить, что это за извращение на Малине.
          • 0
            Если отключить детектор движения, то процессор грузится существенно меньше.

            У меня Raspberry управляет камерой через motion, а собственно запись, просмотр, детекция движения и управление записанным делается на встроенном в NAS Synology приложении. На NASе же и Asterisk крутится.
      • 0
        Спасибо. Как раз хочу сделать домофон на pi. Как раз хотел параллельно писать подъезд — попробую вашим методом…
        • 0
          Обычный регистратор будет дешевле купить.
          • +3
            Тогда пропадет вся составляющая айтишника.
            • 0
              Дело не в деньгах, я собираю voip домофон (хотя может и в деньгах, т.к. такой зверь стоит от 600 мертвых президентов) ;-). Который будет мне звонить через шлюз, когда меня дома не будет. Ну а т.к. он все равно будет камерой в подъезд светить, то почему бы и не писАть?
          • 0
            Не подскажете, как это все использовать с родной камерой raspicam?
            • 0
              Motion умеет работать с raspicam.
              • 0
                Спасибо, буду пробовать.
              • 0
                К сожалению у меня пока нет raspicam, поэтому не могу сказать. Как появится — постараюсь подробно все расписать.
              • 0
                А удавалось кому подключать две камеры к одному устройству?
                • +2
                  Специально проверил, все работает. Думаю можно и больше, главное, чтоб питания хватило.
                  • +2
                    При подключении нескольких USB камер появляются проблемы не только с питанием. Каждая резервирует определенную полосу пропускания USB и «дополнительная» может не запуститься. Как правило, 2 камеры на одном usb-хабе работают (во всяком случае logitech c270\c920), в то же время две Sven CU2 могут не заработать. В некоторых случаях проблему можно решить запрашивая у камеры стрим не в 640х480, а например 320х240 ( его все равно достаточно для работы алгоритмов детектирования движения). Таким образом у меня работали три C270.
                    • 0
                      А вот об этом я не подумал. В таком случае при большом количестве камер можно попробовать usb over network.
                      • 0
                        При большем количестве камер полагаю разумнее использовать более серьезные решения. Кстати интересно изучить насколько производительна малинка в работе с алгоритмами компьютерного зрения\аналитики.
                        • 0
                          Не очень производительна. Если не задействовать аппаратное ускорение видео, то еле ворочается
                • +1
                  отредактировано
                  • 0
                    С весны дом начну строить и уже задумки о подобных решениях. Спасибо.
                      • 0
                        Первым делом нам надо получить изображение с камеры. Т.к. она уже занята (изображение транслируется веб-сервером), то воспользуемся возможностью получения текущей картинки с веб-сервера:

                        curl http://localhost:8080/?action=snapshot > out.jpg
                        

                        А можно сразу попросить mjpg-streamer делать и стриминг и фото, одновременно указав два output-плагина:

                        cd mjpg-streamer 
                        ./mjpg_streamer -i "./input_uvc.so" -o "./output_file.so -f $outpdir -d $delay" -o "./output_http.so -w ./www "
                        

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.