0,0
рейтинг
7 октября 2013 в 15:20

Фотонаблюдение или timelapse видео на Raspberry Pi из песочницы


Недавно у меня возникла необходимость соорудить некое подобие видеонаблюдения. Требования были довольно простые:
  • возможность наблюдать через интернет
  • не обязателен режим реального времени, достаточно вечером просмотреть основные события за день (скажем, узнать, сидит ли кто-нибудь за вашим любимым компом, пока вы на работе)
  • отсутствие необходимости тратить часы на отсмотр результатов
  • максимально возможное качество картинки
  • минимальная стоимость

Исходя из критериев, можно было бы остановиться на готовых решениях в виде IP-камер. Однако, проведенный на скорую руку анализ рынка показал, что в устройствах, стоимостью до $100, размер картинки редко превышает 640x480 точек, и, при этом, они не могут похвастать хорошими возможностями для настройки софта. То есть, вполне возможно, что купив такую камеру, вам придется мириться с кривизной заводской прошивки и невозможностью в полной мере реализовать свои замыслы.

В противовес готовым решениям, самоделка на Raspberry Pi – это достаточно недорого, куда более увлекательно, и гораздо более гибко, благодаря полноценной ОС на борту и терабайтам готового софта на любой вкус.

Для решения описанных задач был придуман следующий алгоритм работы:

В начале дня (по расписанию) в системе запускается процесс, который делает фотоснимки с некоторым интервалом (скажем, раз в минуту), сохраняет их локально на карту памяти и тут же выкладывает на какой-нибудь облачный диск по WebDAV протоколу. Это обеспечивает некоторое подобие «живого» наблюдения, которое, хоть и не требуется по условиям, но является приятным бонусом. В конце дня (тоже по расписанию) процесс фотосъемки прерывается и запускается сборка видеофайла из фотографий. По окончании сборки, видео выкладывается на тот же облачный диск, что дает возможность быстрого удаленного просмотра цельной avi-шки, без необходимости переключения между фото-файлами (10 часов работы, по кадру в минуту, дадут общий хронометраж видео – всего около минуты, при 10 fps).

В таком подходе, конечно, не реализуется видеонаблюдение в его привычном виде, но решаются все поставленные задачи. Кроме того отпадает необходимость покупать у провайдера выделенный IP, чтобы подключаться к камере напрямую, а также нет нужды заводить отдельный сервер видеонаблюдения, потому что его функции хранения и доступа к данным перекладываются на бесплатный сервис (например Яндекс.Диск).

Итак, железо:

  • Raspberry Pi ($50-$60 в наших краях): я использовал model B, ту что c Ethernet, двумя USB и 256 Мб ОЗУ
  • Logitech C270 ($20): относительно дешевая и популярная HD (1280x720) веб-камера, соответствующая спецификации UVC (как следствие, без проблем работающая в Linux системах)
  • Зарядка от iPhone ($10): на самом деле айфон, конечно, ни при чем, подойдет любой источник питания с выходным током от 1А и разъемом micro-USB. Можно найти китайские импульсные зарядки не дороже $2 за штуку, только проверять их надо тщательно.
  • SD карта на 4 Гб ($6): четыре гига — минимальный объем карты для комфортной работы.
  • Корпус для малины ($1): сделан с помощью дремеля из более-менее подходящей коробки, купленной в строительном гипермаркете.

В сборе все выглядит примерно так:



Поскольку это мой первый опыт работы с Raspberry, чуть-чуть остановлюсь на вещах, возможно уже известных более продвинутым пользователям.

Первый нюанс – это питание периферийных устройств. Дело в том, что при включении Raspberry от одноамперного источника, USB портам достается совсем немного тока. В итоге у меня не получилось подключить одновременно веб-камеру и USB Wi-Fi dongle, или две веб-камеры: одно из устройств работало стабильно, а другое сначала вроде бы заводилось в системе, но через минуту просто отказывалось работать.

Второй нюанс – количество USB портов. Их в малинке всего два, а значит подключить камеру, клавиатуру и wi-fi одновременно не получится. Однако есть пара решений.

Во-первых можно подключить к Raspberry питающий USB хаб, а в него уже воткнуть всю необходимую периферию. У меня, например, все работало с таким:



Это увеличит число доступных портов и даст им всем достаточно тока, хотя и потребует занять еще одну розетку 220В.

Во-вторых, имеет смысл управлять малиной по SSH – тогда не нужно подключать ни клавиатуру, ни мышь, ни монитор. А если очень хочется увидеть графическую оболочку, то можно установить VNC server и получить удаленный доступ к рабочему столу. Делается это примерно так:

установка:

sudo apt-get install tightvncserver


запуск сервера на первом порту:

vncserver :1 -geometry 1200x700 -depth 16


Теперь подключиться к «малиновому» VNC можно клиентом из под рабочей ОС (под Windows, например, отлично работает UltraVNC )

Выбор и установка софта:

В качестве ОС я использовал Raspbian, как наиболее подходящую для непродвинутых пользователей. Нужно скачать образ системы и установить его на карту памяти с помощью специальной утилиты (Win32DiskImager под Windows). Все это подробно описано на странице загрузок официального сайта Raspberry: www.raspberrypi.org/downloads

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



Конечно, это можно сделать и позже, командой

sudo dpkg-reconfigure tzdata


Для захвата фото с веб-камеры настоятельно рекомендую использовать mjpg-streamer. Эта утилита – единственная среди опробованных на данной конфигурации железа, смогла выдать фото в «правильном» разрешении. Остальные инструменты которые мне довелось испытать (motion, ffmpeg, streamer), никак не отдавали HD картинку, предлагая в лучшем случае только 640x480, а то и вовсе отказывались запускаться. К сожалению в виде исполняемых файлов mjpg-streamer не распространен, однако скомпилировать его оказывается не сложнее, чем установить готовый пакет. Чем и займемся (предполагается, что все операции производятся от имени пользователя pi).

Сначала стоит обновить локальный индекс пакетов, доступных для установки:

sudo apt-get update


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

sudo apt-get upgrade


Чтобы вывести на фотографиях дату и время их создания, нам понадобится пакет imagemagick, в состав которого входит утилита convert. Она обладает поистине неограниченными возможностями по изменению изображений, так что написать в углу десяток цифр с ее помощью оказывается совершенно несложно. Этот же пакет понадобится и для компиляции mjpg-streamer, так что ставим его, не задумываясь:

sudo apt-get install imagemagick


Склейкой видео из набора фотографий занимается программа aviconv, которую мы тоже установим не самостоятельно, а вместе с пакетом libav-tools, без которого компиляция mjpg-streamer не будет успешной. Ставим:

sudo apt-get install libav-tools


Еще понадобится пакет libjpeg8-dev, который также содержит необходимые библиотеки для mjpg-streamer:

sudo apt-get install libjpeg8-dev


Для скачивания исходников c sourceforge понадобится subversion:

sudo apt-get install 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

В процессе монтирования нужно будет ввести имя пользователя и пароль.

Рабочий процесс шаг за шагом:

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

Итак, запускаем mjpg-streamer:

cd mjpg-streamer 
./mjpg_streamer -i "./input_uvc.so -r 1280x720 -f 1" -o "./output_file.so -f ./ -d 60000"

В таком режиме он будет раз в минуту (-d 60000) в текущем каталоге (-f ./) создавать файл с красивым именем, вроде такого: 2013_10_04_12_11_30_picture_000000000.jpg.

Для отрисовки временной метки на изображении используем скрипт примерно такого вида:

filename="2013_10_04_12_11_30_picture_000000000.jpg"
timestamp=`stat -c %y $filename`
convert $filename -fill black -draw "rectangle 1130,695 1270,715" -fill white -pointsize 15 -draw  "text 1135,710 '${timestamp:0:19}'" ./out.jpg.

Он поставит метку в правом нижнем углу изображения и запишет результат в out.jpg. Получится примерно так:



Для записи на Яндекс.Диск просто копируем нужный файл в /mnt/dav:

cp out.jpg /mnt/dav


Стоит отметить, что само копирование на удаленную файловую систему осуществляется в 2 этапа: сначала файл копируется в локальный кэш где-то в /var/cache/davfs2, а дальше davfs уже занимается собственно переносом файла по сети. Это значит, что команда копирования завершится раньше, чем файл физически окажется доступен в Яндекс.Диске. Поэтому не расстраивайтесь, если не обнаружите на Яндексе только что скопированный файл – скорее всего нужно немного подождать.

Создание видео из набора jpeg-ов нуждается в подготовке: имена файлов должны представлять собой последовательность возрастающих чисел, подчиняющихся определенному шаблону. Вот скрипт, который переименует все jpg файлы в текущем каталоге по возрастанию времени их модификации, а затем запустит конвертацию в avi:

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


Надо сказать, что avconv – тоже очень мощная утилита, умеющая кодировать практически что угодно во что угодно с доброй сотней параметров. Однако стоит учитывать довольно скромные возможности по софтовому кодированию-декодированию видео у Raspberry, чтобы не возлагать на нее слишком много надежд. Например конвертация набора из примерно 600 файлов в фильм, сжатый в H.264, занимала у меня около двух часов. Поэтому в примере выше я использую кодирование в MJPEG, которое по сути ничего не сжимает, а только склеивает jpg друг с другом. Такая конвертация выполняется за несколько минут и не теряет исходного качества картинок.

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

В завершение предлагаю пример самодельного timelapse видео. Обратите внимание, что время в правом нижнем углу — неверное. Это из-за того, что в Raspberry нет часов реального времени, и если ее включить без подключения к интернету, то будет использоваться последнее время работы, без учета часового пояса.

Андрей Ворошков @bshep
карма
15,0
рейтинг 0,0
Увлеченный
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

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

  • +3
    Превосходно! Спасибо большое за пост!
  • –9
    Это конечно все замечательно и статья не плохая, но таких статей извиняюсь, десятки штук.
  • +9
    Вот отличный пример из Ирландии, какой мощный timelapse можно снять с использованием малинки :)
    • 0
      Малинка тут как пушка по воробьям. Ролик снят с использованием хорошего фотоаппарата. А крутить шаговый двигатель (для моторизированной рельсы) и «нажимать» на спуск — с этим справится дешевенький микроконтроллер. На том же arduino это собирается и программируется менее чем за один час.
      • 0
        Не спорю, потому и смайл :) Просто видео мне очень нравится.
  • +3
    Вы молодец, но я сделал вот этой камерой cheklab.ru/archives/3219, получив в плюс съемку в темноте, отправку e-mail по реакции на движение и тому подобное. качество картинки не хуже вашего, ну и плюс большее качество = большая задержка в обновлении кадров. Ну и обошлось мне это все www.dns-shop.ru/catalog/i135200/ip-kamera-d-link-dcs-932l-s-ik-podsvetkoj.html

    По ссылке:
    Камера наблюдения за домом и офисом DCS-932L – универсальное и уникальное решение для малого офиса и дома. В отличие от стандартных web-камер DCS-932L является полноценной системой со встроенным процессором и web-сервером, который передает высококачественное видеоизображение системе видеонаблюдения и безопасности. Простая установка и интуитивно-понятный web-интерфейс предоставляют возможность интеграции с Ethernet/Fast Ethernet или беспроводной сетью 802.11n. DCS-932L также имеет функции удаленного управления и обнаружения движения для комплексного и эффективного решения домашней безопасности.
    • 0
      Хороший вариант. Для моих целей осталось только докупить Arduino с сервоприводами и организовать поворот камеры. И неплохо бы еще перемещение по квартире на гусеничной платформе (пусть и с тянущемся за ней шнуром питания).
      • +1
        Не знаю, что у вас за зловещие цели, но по моему проще купить еще камер и развесить в обзорные точки, благо камеры работают по вафле, можно хоть у каждой розетки повесить + еще на лестничную клетку.
        • 0
          Не интересно. А так можно за собакой погоняться сидя на работе :)
      • +2
        Лучше монорельс для камеры небольшой под потолком для съемки в разных ракурсах.
      • 0
        Шнур питания не обязателен. На ноутбучном аккумуляторе можно ездить и ездить особенно на гусеницах. А проблема зарядки, при необходимости, решается просто — добавляем манипулятор с катушкой с открытым магнитопроводом, получается контактно-безконтактная система индуктивной подзарядки. Когда заряд подходит к концу, подъезжаешь к зарядному терминалу и подводишь манипулятор к зарядному гнезду, можно даже неточно.
        • 0
          Да, это было бы круто. Вот бы теперь мануал как это всё аккуратно сделать :)
          • 0
            Берешь две катушки от индукционной плиты… одну в полу, другую вделать в днище робота. Частоту можно дать побоьше для повышения эффективности и делов-то. На заряднике периодически проверять индуктивность излучателя, когда добротность упадет — значит наш механизм на месте и готов к заряду.
    • 0
      Спасибо за ссылку! А как к этой штуковине доступ организован? Обнаружил, что у D-Link'а есть некое решение для удаленного доступа: eu.mudlink.com, но не очень понимаю как он работает. Это storage? Или вебсайт для просмотра в реальном времени? Будет ли он работать без внешнего IP у камеры?
      В защиту решения на raspberry приведу возможность работы при отсутствии доступа к инету (все хранится локально, пока интернет снова не включится). И, все-таки, немного меньшую цену :)
      • 0
        Там веб сервер, и все потоки доступны по адресу вида cameraIP/stream.jpeg например, и да без доступа в инет он хранить данные не умеет, но вы можете настроить сохранение в ваш локальный фтп репозиторий, что она тоже умеет.
  • 0
    Классно!
    Осталось только заказать красивых коробочек — и можете выпускать недорогое коммерческое решение.
    • +1
      Плюс автору статьи — интересная разработка.

      Но для недорого коммерческого решения (поверьте человеку, имеющему опыт мелкосерийного производства) проще закупить китайских noname смартфонов на Андроиде и всё реализовать на готовом железе. Можно будет и геотаги сделать через GPS, и доступ в инет организовать не только по WiFi, а по GPRS.

      Как мы знаем, Андроид построен на линуксе и доступ к девайсам там можно получить точно так же как в Raspberry PI. Поэтому если задача использовать программные решения, упомянутые в статье, на Андроид-девайсе всё это можно реализовать. Там можно писать даже нативные приложения при помощи кросс-компилятора.

  • 0
    Эм… Я брал обычную зеркалку (уж качество изображения не идет в сравнение с вебкамерой). Брал Ардуину и 2 инфракрасных светодиода. Библиотеки доступны. Проще и качественнее выходит. Работы на полчаса.
    • +3
      Зеркалка для фотонаблюдения? Вы суровы.
  • 0
    А если очень хочется увидеть графическую оболочку, то можно установить VNC
    sudo apt-get install tightvncserver

    Я бы порекомендовал:

    sudo apt-get install xrdp

    в этом случае из-под винды можно подключаться обычным RDP, а из линя — через rdesktop.
    P.s. И да, по субъективным ощущениям протокол rdp пошустрее работает, чем vnc. Говорят, это связано с более лучшим сжатием картинки.
  • +2
    К RPi можно родную камеру взять, 2592 х 1944 пикселей, видео в трех режимах — 1080р (30fps), 720p (60 fps) и VGA (60 или 90fps)
    не занимает USB порт, с ходу поддерживается Распбиан. Правда подороже будет чем ваш лоджмк — "в наших краях" почти 40$, в их краях 21 евро.
    • +1
      Не знаю, что где и как, но мне в Украину малинкина камера обошлась за 31 бакс с учетом доставки и пришла за 5 дней.
      • 0
        А где заказывали?
    • +1
      Так, стоп. Там же нету никаких UVC и работают с ней только две программки, специально написанные под эту камеру, не так ли?
      • 0
        А зачем в данном случае UVC и сто программ? Не занимает USB порт, подключается к своему коннектору, использует программу заточенную под нее, более конфигурабельна чем внешняя USB камера.
  • 0
    Объясните, пожалуйста, вот что:
    После обработки утилитой convert получаем на выходе файл out.jpg. Каждую минуту. Копируем в сеть.
    Как не происходит перезапись старого файла новым?
    • 0
      В статье я для простоты описал только общую последовательность действий, без попыток построить четкую рабочую систему. На самом деле, у меня, выходной файл после convert пишется в отдельный каталог с оригинальным именем:

       outdir="mov"
       convert $filename <params> $outdir$filename
      

      а потом копируется в сеть.
      • +1
        Хотите сказать, на самом деле всё намного сложнее и путь утыкан граблями, о которых Вы умолчали?
        • +1
          Нет, как раз наоборот — основные грабли я постарался описать в статье. Дальнейший же путь обусловлен фантазией и конкретными задачами, и утыкан, по желанию, bash- и прочими скриптами для воплощения задуманного.
    • 0
      А можно немного подробнее про имена файлов, для «чайника»?
      • 0
        Процесс выглядит так: mjpg-streamer пишет файлы с красивыми уникальными именами в каталог «capture». Отдельный bash-скрипт, висящий в фоне с некоторой периодичностью пробегает по всем файлам в этом каталоге и для каждого делает convert, который. в свою очередь записывает выходной файл с меткой уже в другой каталог — «mov», но с тем же красивым именем, плюс копируется в сеть. Благодаря тому что mjpg-streamer выдает файлы с уникальными именами, никаких проблем с перезаписью не возникает.
  • +1
    Делал запись видео на намного более слабом девайсе (200 MHz). Тоже mjpg_streamer, но пропатченный. Основная беда виделась в том, что если рендерить картинки с фиксированным фпс — его надо выдерживать, иначе поползёт синхронизация по времени (если звук ещё параллельно пишешь).

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

    Соответственно, видео собирается уже на большом компе перловским скриптом с использованием того же ffmpeg с парой оптимизаций — без промежуточных картинок с convert — точнее, без записи их в ФС. Для этого ffmpeg'у отдаю всё в FIFO в формате PNM, а картинки верчу при помощи PerlMagick.

    В общем, кому интересно — могу показать, рассказать :-)
    • 0
      Расскажите конечно =)
    • 0
      Было бы здорово. Как раз мучаюсь с таким девайсом.
  • 0
    Ваша штука не способна ли приблизить решение моей хотелки — организовать Облако камер наблюдения со свободным доступом??
  • +1
    Делал тоже самое на платке с A10.
    Потом перешёл на fswebcam (оно само делает кадры с нужной частотой и дата-время маркировкой, написал юнит и при ребуте стартует с systemd).

    Потом написал скрипты, которые по средней яркости кадра определяют начало и конец светлого времени суток, и из этих jpeg-ов формируют avi, через google-cl заливают его на ютуб. (на ютубе ролик должен быть не более 15 минут для неподтвержденных аккаунтов, а без обрезания ночного времени получалось минут 20)
  • +4
    Ваш Defender Quadro Power сможет самостоятельно питать не только периферию, но и саму RPi?
    • +5
      Как-то мне это в голову не пришло, но специально сейчас попробовал — питает Raspberry, камеру и донгл беспроводной клавиатуры абсолютно без проблем! Выглядит презабавно: из дефендера выходит шнурок в расбери, а из расбери — в дефендер :)

  • 0
    Хотите верьте, хотите нет, но собирался написать похожую статью… и тут вы :) Кстати, наблюдение тоже за стройкой и камера та же самая. Правда есть некоторые (возможно любопытные) нюансы, так что может еще и напишу :)

    Вопрос к уважаемому сообществу: на что заменить вебкамеру, чтобы получить хорошую картинку происходящего в 15 метрах от объектива? Из бюджетного пока приходит в голову старая аналоговая камера, типа miniDV с платой видеозахвата. Но это какая-то не очень изящная идея.
    • +1
      Ныне популярные USB-микроскопы. Это та же камера по сути с телескопическим объективом. Оптика построена там таким образом что имеет два фокусных расстояния — на 10-20мм и 5-6 метров. Настроенная на бесконечность она прекрасно работает как телескопический объектив.
      • 0
        Полагаю, качество картинки там не будет лучше, чем у какого-нить панасоника с тремя матрицами и оптическим зумом) Изящность решения роли не играет, как и разрешение картинки, нужен не fullHD, а просто качественный кадр
  • +1
    А исходники скриптов можно на github увидеть?
  • +1
    Гляда на видео сразу понято, что рабочие на стройке нихера не делают. только ходят из угла в угол
  • +2
    Сетап — аналогичный практически, малинка и та же самая камера, только цель больше небо, снимок каждые 5 сек:

    • 0
      Прикольно разок глянуть. А Вам оно зачем? В чём польза затеи?
  • 0
    Первая камера в Я.Маркете D-Link DCS-2103 за 3200р — 1280x800/30p, с поддержкой microSD. На 300р дороже сетапа из топика.

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