Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 111, МАРТ 2008 г.

Сумеречный дозор

Владимир «turbina» Ляшко (v.turbina@gmail.com)

Хакер, номер #111, стр. 111-098-1

Motion: детектор движения для Linux

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

Система обнаружения движений Motion

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

Гораздо эффективнее, если вместо всего потока, приходящего с камеры, на диск будет записана информация только при обнаружении изменения. Зашел человек - запись началась, вышел - закончена. Тогда при просмотре можно будет быстро разобраться, заходил ли кто в комнату, и если да, то что он там делал.

Поиск на специализированных ресурсах, вроде freshmeat.net, выдаст не один десяток проектов, но фактически на данный момент активно развиваются только три - Motion (www.lavrsen.dk/twiki/bin/view/Motion/WebHome), ZoneMinder (www.zoneminder.com) и NetAvis Observer (www.netavis.net/evo/web/xperts/1049_EN). Так что выбрать есть из чего.

Программа Motion способна контролировать сигнал, полученный с одной или нескольких видеокамер, и обнаруживать наличие изменений на картинке. На выходе получаем фотки в форматах jpeg, ppm или mpeg видеопоток, который может транслироваться в сеть или записываться в файл. При необходимости на указанный почтовый адрес может быть отослано сообщение с информацией о событии. Возможно выполнение любой предусмотренной пользователем команды или скрипта, поэтому реакция системы зависит только от твоей фантазии. Например, в Сети я видел информацию, как заставить Asterisk звонить на мобилу при обнаружении движения. Как вариант, Motion может просто захватывать кадры с указанного устройства через определенные интервалы времени или по команде cron.

Motion написан на языке Си, изначально разрабатывался для Linux, но может работать и в FreeBSD и Mac OS X. Поддерживаются все типы популярных сегодня видеокамер, подключаемых к компьютеру через USB порт, Video4Linux устройства и сетевые камеры. Драйверов для видеокамер проект Motion не предоставляет, поэтому прежде чем начинать настройку, убедись, что твоя камера видна операционке.

Фактически вся рабочая система представлена демоном, который потребляет небольшое количество системных ресурсов. В текущей версии 3.2 убраны практически все параметры командной строки запуска, поэтому установки производятся исключительно путем правки конфигурационных файлов. Никаких супер-пупер удобных графических инструментов для этих целей не предусмотрено. Хотя Motion имеет встроенный http-сервер, предназначенный для просмотра захваченного видео и прямой правки параметров в конфиге. Ряд проектов (www.lavrsen.dk/twiki/bin/view/Motion/RelatedProjects, www.silicontao.com/software/lvs/doc/information.html) предлагают интерфейс для просмотра и настройки.

Конфигурационные файлы Motion

На странице Downloads проекта можно найти исходные тексты, а также пакеты для некоторых дистрибутивов (Fedora от 7, Debian Lenny/Sid, Ubuntu Feisty/Gutsy). Обрати внимание, что некоторые из них собраны с поддержкой БД, другие - нет. Здесь же найдешь ссылки на SVN и срезы Motion (Daily и Releases). А вообще Motion присутствует в репозитариях большинства дистрибутивов, да и проблем с "ручной" компиляцией обычно не возникает, поэтому выбирай удобный для себя способ и устанавливай.

Конфигурационный файл Motion называется motion.conf. Если его месторасположение не указано при помощи параметра '-c', демон будет искать его в текущем каталоге, в ~/.motion и в /usr/local/etc. При сборке пакетов разработчиками обычно используется параметр "--sysconfdir=/etc/motion", поэтому нужный файл, возможно, находится в указанном каталоге. Если производилась установка из исходных текстов, следует переименовать файл шаблона motion-dist.conf (это сделано специально, чтобы при обновлении не затереть рабочий конфиг).

Если используется одна камера, файла motion.conf достаточно, но если их несколько, для каждой камеры понадобится подготовить персональный conf-файл. Общие для всех настройки оставляем в основном, а индивидуальные выносим в отдельные файлы. Кстати, в архиве уже есть несколько готовых шаблонов thread[1-4].conf. Если в будущем планируется расширение, то лучше сразу использовать thread-файл и подключить его в motion.conf при помощи конструкции:

thread /usr/local/etc/thread1.conf

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

$ sudo mcedit /etc/motion/motion.conf

# Видеоустройство для захвата, в FreeBSD по умолчанию /dev/bktr0

videodevice /dev/video0

# Используемый вход для видео, может иметь два значения;

# по умолчанию используется 8 (для USB камер), для V4L устройств ставим 1

input 8

# Устанавливаем количество захватываемых кадров в секунду;

# здесь следует ввести число в диапазоне 2 – 100 (100 – по умолчанию)

# для PAL стандартным является 25

framerate 25

# И не менее важный параметр target_dir, в нем определяем каталог,

# куда будем складывать захваченные с видеокамеры файлы;

# в качестве имени можно использовать переменные,

# все они описаны в оригинальном файле

target_dir /var/lib/motion/snapshots/

# Имя файла для снимков и видео, в примере оставляем значение по умолчанию

# %Y = год, %m = месяц, %d = день, %H = час, %M = минута, %S = секунда

snapshot_filename %v-%Y%m%d%H%M%S-snapshot

jpeg_filename %v-%Y%m%d%H%M%S-%q

movie_filename %v-%Y%m%d%H%M%S

timelapse_filename %Y%m%d-timelapse

Вот, собственно, и все основные настройки. Если используется карта видеозахвата или TV тюнер, при помощи параметра norm указываем стандарт. По умолчанию используется 0, то есть PAL. Возможны значения 1 - NTSC, 2 – SECAM и 3 PAL NC. Для TV тюнера также указываем частоту. По умолчанию frequency = 0.

Чтобы Motion не переходил в режим демона и выводил отладочную информацию в консоль, используем флаг '–n'.

$ motion –n

Thread is from /etc/motion/motion.conf

[1] Thread started

[1] motion-httpd/3.2.3 running, accepting connections

[1] File of type 8 saved to: /var/lib/motion/snapshots/01-20071225210503.avi

[1] File of type 1 saved to: /var/lib/motion/snapshots/01-20071225210503-18.jpg

И так далее. В указанном каталоге можно увидеть видеофайл и несколько снимков. Если файлы не появляются, прежде чем ругаться, советую побегать перед камерой :). Также в ответ на ввод команды может последовать сообщение о невозможности записи в указанный каталог. Вариантов выхода из такой ситуации целых два. В тестовом прогоне можно использовать sudo, а в повседневной жизни лучше разрешить запись в этот каталог членам группы (например, video) и себя, естественно, в нее включить.

Если у тебя нет веб-камеры, можно подключить любую доступную сетевую камеру или использовать локальный файл. Для этого достаточно в параметре netcam_url указать URL. В качестве источника может быть HTTP, FTP-ресурс, файл в формате jpeg или mjpeg видеопоток. Если сетевая камера требует аутентификации, укажи логин и пароль в netcam_userpass. Прокси-сервер прописывается в netcam_proxy. Да, и главное: сетевая камера - это отдельный thread, совместное использование в одном файле videodevice вызовет конфликт.

Использование веб-браузера

В состав Motion включен мини http-сервер, который позволяет просматривать в реальном времени картинку с камеры в окне браузера. Открываем motion.conf и ищем в самом низу секцию "Live Webcam Server". При инсталляции с помощью пакетов значение параметра webcam_port установлено в 0, то есть http-сервер отключен. Чтобы он заработал, достаточно указать здесь любой свободный порт (традиционно 8081). Параметр webcam_localhost по умолчанию устанавливается в on, поэтому подключиться к http-серверу можно только с локального компьютера. Если планируется заходить по сети, укажи здесь off. Качество выводимых сервером jpeg изображений выставляется при помощи webcam_quality. Значение 50, скорее всего, трогать не придется. По дефолту картинка в браузере меняется только при обнаружении движения. Активировав webcam_motion, можно указать, чтобы картинка постоянно менялась с частотой 1 кадр, а при движении - с частотой, указанной в параметре webcam_maxrate. Значение последнего параметра по умолчанию установлено в 1, не стоит указывать его выше 4-5. И еще один параметр - webcam_limit, с его помощью указывается максимальное количество изображений за соединение. По умолчанию установлено значение 0, то есть без ограничений. При соединении с localhost и работе с одной камерой, наверное, трогать его и не нужно.

Теперь, если снова запустить Motion, в командной строке должно появиться сообщение: "Started stream webcam server in port 8081". Набираем в браузере адрес своего компьютера, например http://localhost:8081, и смотрим, что показывает нам камера.

С просмотром разобрались, но встроенный http-сервер также позволяет изменять настройки Motion. Конфигурируется эта функциональность в секции "HTTP Based Control" файла motion.conf. Для подключения следует использовать порт, отличный от указанного в webcam_port. За это отвечает параметр control_port. Его значение по умолчанию установлено в 0, то есть данная функциональность также отключена. Меняем на 8080. По умолчанию параметр control_localhost активирован, поэтому если понадобится подключаться с удаленной системы, ставим здесь off. А чтобы зайти на сервер не мог, кто попало, используем конструкцию:

control_authentication username:password

Указываем логин и пароль для аутентификации. Теперь, набрав в консоли "motion -n", среди строк вывода ты должен увидеть "motion-httpd: waiting for data on port TCP 8080". Набираем в браузере адрес и получаем возможность указывать настройки для каждой камеры (thread), выбирая их и вводя нужные значения. При работе с несколькими камерами такой способ тебе, вероятно, покажется более удобным.

Настраиваем изображение и видео

Итак, файлы у нас уже есть, http-сервер работает, самое время заняться подстройкой. А тюнить в Motion есть что. Например, параметр rotate. Ты не ошибешься, если подумаешь, что с его помощью можно вращать полученное изображение. Поэтому если камеру удобнее закрепить в перевернутом виде, ничего страшного. Используемое по умолчанию 0 означает сохранение без вращения, возможны варианты 90, 180 и 270. При захвате устанавливается размер кадра, выдаваемый камерой, для его изменения редактируем параметры width и height. Если камера не поддерживает автоматическую регулировку яркости, ее можно установить вручную. За это отвечает сразу несколько параметров. Так отключенный по умолчанию auto_brightness разрешает Motion регулировать яркость. Ее величина берется из значения brightness, регулируемого в пределах 0-255. Если последнее установлено в 0, тогда auto_brightness установит среднее значение 128. Аналогично за регулировку контраста и насыщенности отвечают соответственно contrast и saturation. Качество изображения регулируется с помощью quality. Чтобы изменить формат файла с jpeg на ppm, параметр ppm устанавливаем в on.

По умолчанию при обнаружении движения образуется не только видеофайл, но и последовательность изображений. Параметром output_normal можно изменить такое поведение. Так при установке в first будет сохранено только первое изображение, best – лучшее, а отключить эту функцию можно, использовав off. Активация output_motion разрешит сохранять в снимке только пиксели, показывающие движущийся объект. Правда, пока я не нашел практического применения этому параметру, разве что для съемки продолжения "Охотники за привидениями".

При установке пакета из репозитария Ubuntu в конфигурационном файле motion.conf функция записи захваченного видео отключена. Поэтому при необходимости измени значение ffmpeg_cap_new на on. Аналогично с output_motion, есть такой же параметр и для видео - ffmpeg_cap_motion, при активации которого в результирующий видеофайл будут сохранены пиксели, показывающие движущийся объект.

За качество результирующего видео отвечают два параметра: ffmpeg_bps или ffmpeg_variable_bitrate. При настройке следует использовать лишь один из них. Качество лучше подбирать экспериментальным путем, исходя из мощности системы и возможностей камеры. Кодек задается при помощи ffmpeg_video_codec, по умолчанию используется mpeg4, но при необходимости можно использовать: mpeg1, msmpeg4, swf, flv или ffv1.

В некоторых случаях полезной будет возможность периодической записи. Параметр ffmpeg_timelapse отвечает за период, в течение которого ведется запись информации в один видеофайл, затем будет создан новый. Возможные значения: daily (за день, по умолчанию), hourly, weekly-sunday, weekly-monday, monthly и manual. Например, чтобы запись на видео велась каждую секунду, устанавливаем "ffmpeg_timelapse 1". Если во время захвата с аналоговой камеры при перемещении объектов появляются искажения, установи ffmpeg_deinterlace в on.

В файл, кроме собственно объекта, за которым следит камера, заносится и дополнительная информация, позволяющая определить время съемки. Эти данные настраиваются в секции Snapshots. Например, установка цифры в snapshot_interval позволит делать снимки с указанным периодом вне зависимости от обнаружения движения. Активация locate выделит на снимке движущийся объект. Текст, выводимый в левом и правом углах снимка, указывается соответственно в text_left и text_right. В настройках по умолчанию выводится дата и время, когда сделан снимок (формат strftime(3)). Если камер несколько, для удобства можно активировать text_left, где прописать что-то вроде "Camera 1".

Настройка захвата

Секция "Motion Detection Settings", расположенная в самом конце конфигурационного файла, отвечает за тонкую настройку обнаружения движущихся объектов. Если камера стоит в комнате, и тушка входящего перекрывает объектив, проблем с обнаружением обычно нет. Вмешательство потребуется в том случае, когда камера контролирует большую территорию, где объект имеет относительно маленький размер, и срабатывание может быть вызвано колыханием веток деревьев, проезжающими машинами и прочими помехами. На дешевых девайсах запись может начинаться из-за артефактов, вызванных искажениями самой камеры или поведением драйвера.

Например, threshold позволяет указать количество пикселей, которые должны измениться для срабатывания детектора, а minimum_motion_frames - количество кадров, в котором они зафиксированы. Подобрав эти значения, можно сделать так, что Motion не будет замечать пролетающую птицу, но без проблем реагировать на человека. Фильтры для сглаживания шума подключаются при помощи despeckle. По умолчанию используется оптимальное значение EedDl. При появлении проблем следует поэкспериментировать, убирая буквы в сочетании EedDl и пробуя их в разных комбинациях (подробнее о despeckle смотри на WiKi Motion и на emit.demon.co.uk/motion).

Параметры noise_level, noise_tune, night_compensate и lightswitch отвечают за уровень порога шума и компенсацию темных и светлых участков.

Комбинация параметров pre_capture, post_capture и gap позволяет записать законченную сцену, где будет снят контролируемый объект до и после того, как было обнаружено движение. Значение gap по умолчанию установлено в оптимальные 60 (секунд), если движение не будет обнаружено, то создается новый видеофайл, а старый удаляется. Чтобы захваченный файл не был большим, его продолжительность можно ограничить параметром max_mpeg_time, указав в качестве значения время в секундах.

Параметров в motion.conf очень много, обо всех рассказать не получится. Но остался еще один, о котором следует знать. Например, поставил ты камеру в общежитии на кухне, где топчется много народу, но тебя интересуют лишь те, которые лазят в холодильник. Без проблем, делаем снимок камерой, создаем маску, в которой нужная область окрашена белым, а все остальное, что нас не интересует, черным. Сохраняем его в файле формата pgm и указываем путь при помощи mask_file. Все. Холодильник с пивом под присмотром.

ZoneMinder

ZoneMinder работает со всеми источниками, которые только можно себе представить: USB и IP камеры, устройство видеозахвата, поток со встроенного веб-сервера, периодически обновляемый локальный файл, например, полученный в том же Motion. Поддерживается одновременная работа с несколькими камерами и управление некоторыми типами камер. Управление возможно как локально, так и удаленно через веб-интерфейс и частично xHTML (с мобильных телефонов). Причем веб-интерфейс обладает гораздо большими возможностями, чем в Motion. Работает в Linux и FreeBSD, есть и клиент для Windows. Установка ZoneMinder чуть сложнее Motion. Потребуется веб-сервер с поддержкой PHP, база MySQL и библиотека JPEG.

Настройка веб-камер в Linux

В некоторых дистрибутивах нужные модули ядра подгружаются автоматически, и проблем с определением веб-камер нет. Но если вывод "dmesg | less" не показывает наличие video4linux устройств, придется самостоятельно компилировать модули. Это не сложно. Поиск драйверов для веб-камеры следует начинать со странички mxhaard.free.fr/download.html. В настоящее время проект предлагает две версии: gspcav1 "Generic Softwares Package for Camera Adapters" для ядер < 2.6.11 и spca5xx для ранних версий ядра. В репозитариях многих дистрибутивов нужные пакеты присутствуют (в Ubuntu - gspca-source и spca5xx-source), хотя, возможно, не самых последних версий. Для установки драйвера следует скачать пакет и запустить находящийся внутри скрипт gspsa_build. Ссылки на некоторые другие решения, предлагающие свои драйвера, ищи на странице Download проекта Motion.

Подробнее о настройке веб-камер смотри в tldp.org/HOWTO/Webcam-HOWTO.

Содержание
ttfb: 8.9058876037598 ms