Видеонаблюдение на 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 или Сделай Сам, Железо, Гаджеты. Устройства для гиков» не хватило кармы, выбрал наиболее близко доступное.

ссылка на оригинал статьи http://habrahabr.ru/post/208058/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *