Пользователь
0,0
рейтинг
3 января 2014 в 13:01

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

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (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
    С весны дом начну строить и уже задумки о подобных решениях. Спасибо.
  • +2
  • 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 "
    

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