LXF115:Hardcore Linux

Материал из Linuxformat.

Перейти к: навигация, поиск
Hardcore Linux Проверь себя на крутом проекте для продвинутых пользователей

Содержание

Web-камеры: Стать Большим Братом

Ян Бартон поделится восхитительной уверенностью, что за за вашей собственностью есть присмотр. Он следит за вами уже сейчас...

Враг может притаиться где угодно.

До того, как ее присвоили фанатики и упыри из реалитишоу, фраза «Большой Брат» служила удобным обозначением всех тех, кто хотел ограничить наши гражданские свободы. Если информация – это власть, мы должны попытаться пресечь сбор непомерного ее количества избранниками народа, чтобы народ контролировал правительство, а не наоборот. Зачем же тогда Linux Format публикует учебник по web-камерам? Мы ведь все верим в Свободу, с большой буквы?

Ну, мне-то ни к чему угнетение пролетариата, я просто хочу присмотреть за своими коровами. Я живу на ферме, и должен днем и ночью видеть, что происходит: вдруг кто-то пролез во двор и пытается что-то украсть, или животные решили устроить полуночный моцион. Моя статья покажет, как построить сравнительно недорогую систему безопасности, используя web-камеры и программный детектор движения. Если у вас есть широкополосное подключение, вы сможете контролировать ваши камеры из любого места, где есть интернет-доступ, а когда система обнаружит подозрительную активность, вы получите сообщение по электронной почте. Конечно, обретя такую власть, можно пойти и по стопам КГБ, ну да авось вы не пойдете.

Часть 1 Настройка камер

Мы используем систему на основе Debian, однако приведенные инструкции должны работать практически с любым дистрибутивом Linux. Единственная серьезная проблема, с которой вы можете столкнуться – web-камера (обычно с подключением через USB), не поддерживаемая в Linux.

Web-камеры можно подключать через USB, Ethernet или беспроводную сеть (такие обычно называют «сетевыми камерами»). Linux поддерживает web-камеры USB не полностью. Проблема осложняется тем, что изготовители нередко используют под одной и той же маркой разные микросхемы, так что даже если какой-нибудь экземпляр заработает, другой, якобы того же типа, может отказать. Сетевые камеры, как правило, имеют встроенный web-сервер, а иногда и беспроводной передатчик, и могут быть подключены через Wi-Fi. На нашем уроке мы воспользуемся камерой Linksys WVC54GCA: она не особо дорогая, имеется в продаже и настраивается для работы с Linux.

Первый шаг на пути к настройке USB-камеры – определение чипсета, который она использует. Просто подключите ее к компьютеру и запустите lsusb:

ian@scamper:~$ lsusb
Bus 007 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 002: ID 046d:08af Logitech, Inc. QuickCam Easy/Cool
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 003: ID 04f2:b013 Chicony Electronics Co., Ltd

Отсюда видно, что это Logitech QuickCam, которую можно купить рублей за 800. Беглый поиск в Google показывает, что она поддерживается драйвером gspca. Во многих дистрибутивах, в том числе в Ubuntu Hardy, он встроен в ядро, но версия драйвера, идущая с Hardy, не работает с данной конкретной web-камерой Logitech.

Мы можем проверить поддержку конкретной web-камеры, поискав в Google ID нашего устройства, в данном случае 08af. Небольшое исследование показало, что на поддержку этой web-камеры способна последняя версия драйвера gspca, доступная на http://mxhaard.free.fr/download.html. Итак, для начала загрузим последнюю версию для ядра 2.6 с http://mxhaard.free.fr/spca50x/Download/gspcav1-20071224.tar.gz.

Cкачав драйвер, распакуем его:

 tar -xvzf qc-usb-0.6.6.tar.gz

Установка довольно проста. Во-первых, мы должны установить заголовки ядра Linux и пакеты build-essential:

sudo apt-get install build-essential linux-headers-$(uname -r)

Для сборки драйвера gspca запустите от имени root

./gspca_build

Если все пойдет нормально, модуль ядра соберется и загрузится. Далее следует подключить web-камеру и открыть Cheese или любое другое приложение, способное выводить с нее картинку. Если вы узрите свою физиономию на экране, значит, web-камера работает.

Для настройки сетевой камеры будет лучше подключить ее прямо к концентратору, не связываясь с беспроводным соединением. Сперва надо изменить IP-адрес вашего компьютера на ту же подсеть, что и у камеры. Наш компьютер мы настроим на адрес 192.168.1.10. Теперь откройте Firefox и наберите адрес камеры по умолчанию – http://192.168.1.115/. Вы должны увидеть стартовую страницу камеры. Нажмите кнопку Setup и введите имя пользователя и пароль (по умолчанию admin admin).

Настройте IP-адрес и маску так, чтобы камера стала частью вашей подсети. В данном учебнике мы будем подразумевать подсеть 192.168.0.0, поэтому введите 192.168.0.26 в качестве IP-адреса камеры и 255.255.255.0 в качестве маски, а затем укажите свой часовой пояс. Неплохой идеей будет включить контрольный светодиод, дабы, посмотрев на него, вы могли убедиться, что web-камера работает. Не забудьте сменить на своем компьютере IP-адрес обратно на что-то в диапазоне 192.168.0.0 после завершения настройки.

По умолчанию Linksys WVC54GCA выдает видеопоток в формате MPEG4 ASF. Его можно просмотреть из MPlayer или VLC:

 mplayer http://cam.era.ip.address/img/video.asf

Но нам необходим поток видео в формате MJPEG. Введите URL-адрес камеры в вашем браузере в следующем формате:

 http://your.webcam.ip.address/adm/file.cgi?h_videotype=mjpeg&todo=save

Если требуется вернуть назад формат ASF, используйте следующий формат URL:

 http://your.webcam.ip.address/adm/file.cgi?h_videotype=mpeg4&todo=save

Часть 2 Установка ПО для наблюдения

Теперь, имея пару рабочих web-камер, настроим программы для наблюдения за ними. Motion (http://www.lavrsen.dk/twiki/bin/view/Motion/WebHome) успешно балансирует между функциональностью и простотой установки. Стоит изучить Wiki на сайте Motion, так как там масса опций настройки. Motion присутствует в виде пакета Debian/Ubuntu, и для его установки на Debian достаточно набрать

 sudo apt-get install motion

У нас Ubuntu, поэтому Motion устанавливается как демон. Когда мы все настроим, это будет шикарно. Однако сперва легче запустить его вручную от имени обычного пользователя и опробовать различные варианты конфигурации. Сперва остановим демона:

sudo /etc/init.d/motion stop

Motion ищет свои файлы конфигурации в нескольких местах, и вы можете указать их расположение в командной строке при запуске. Ubuntu помещает файлы конфигурации в /etc/motion. Скопируем их в директорию ~/.motion, чтобы иметь возможность изменять файлы, перебирая различные опции. Создайте каталог .motion:

mkdir ~/.motion

Скопируйте файлы из директории по умолчанию в .motion, а затем измените владельца файлов, чтобы мы могли их редактировать:

sudo chown -R ian.users /.motion

Основной конфигурационный файл – motion.conf. Чтобы наблюдать более одной камеры, каждый процесс наблюдения должен быть запущен в своем собственном потоке и иметь собственный файл конфигурации (thread1.conf, thread2.conf, и т.д.). Примеры установки по умолчанию имеются в только что созданной директории ~/.motion.

Магические опции

Начнем с одной web-камеры, поместив ее настройки в thread1.conf. Файл motion.conf хорошо откомментирован, со многими возможными опциями. Заметим, что поскольку мы используем потоки, мы должны включить их в motion.conf (чтобы понять, как это делается, см. далее пример файла motion.conf).

# Remember: If you have more than one camera you must
have one
# thread file for each camera. E.g. 2 cameras requires 3 files:
# This motion.conf file AND thread1.conf and thread2.conf.
# Only put the options that are unique to each camera in the
# thread config files.
thread /home/ian/.motion/thread1.conf
thread /home/ian/.motion/thread2.conf

Большинство опций в thread1.conf мы оставим по умолчанию. Те, что нам действительно надо изменить, приведены ниже. Настройка videodevice предполагает использование web-камеры USB. Чтобы узнать, какое устройство использует наша web-камера, подключите ее к компьютеру и введите

ian@scamper:~$ ls /dev/video* 
/dev/video0

Эта строка выведет список всех подключенных видеоустройств. У нас только одна USB-камера, и это /dev/video0.

Теперь проделаем следующие изменения в thread1.conf:

# Video device
videodevice /dev/video0
# Image width (pixels). Valid range: Camera dependent, default: 352
width 640
# Image height (pixels). Valid range: Camera dependent, default: 288
height 480
# Make automated snapshot every N seconds (default: 0 = disabled)
snapshot_interval 0
# Target base directory for pictures and videos
# Recommended to use absolute patch. (Default: current working
# directory)
# Must be writeable by Motion.
target_dir /home/ian/public_html/webcam/usb_cam

Можно задать высоту и ширину изображения согласно настройкам web-камеры по умолчанию. Если хотите, задайте их меньше, чем позволяет web-камера. Чтобы Motion работало как типичное приложение для web-камеры, делая снимки через заранее заданные интервалы, установите snapshot_interval в файле thread.conf в значение, отличное от нуля. А главное, задайте в опции target_dir директорию, куда Motion будет сохранять данные.

И это функционирует?

Теперь проверим, что все работает. Запустите Motion:

motion -c ~/.motion/motion.conf

Опция -c велит Motion использовать файл конфигурации ~/.motion/motion.conf, а не /etc/motion/motion.conf. Использовать ключ -c и всегда указывать местоположение файла конфигурации – хорошая идея, так как Motion ищет свои настройки в нескольких разных местах, и выбирает последнее найденное.

Пару раз попрыгайте перед web-камерой и загляните в директорию, указанную в target_dir. Если все работает, вы должны увидеть несколько AVI-файлов. Установив snapshot_interval отличным от нуля, вы увидите еще и JPEG-файлы. Заметим, что Motion всегда создает файл с именем lastsnap.jpg, это символьная ссылка на последний снимок.

Настроив web-камеру USB, перейдем к настройке Motion для работы с нашей сетевой камерой Linksys. Создайте thread2.conf (или отредактируйте его) и убедитесь, что он включен в motion.conf. Кроме того, убедитесь, что вы использовали вышеприведенный способ для настройки Linksys на вещание в формате MJPEG, а не файлов ASF. Закоментируйте все существующие строки videodevice и вставьте следующий текст:

#videodevice /dev/video1
netcam_url http://your.webcam.ip.address/img/mjpeg.cgi

Задайте целевую директорию, чтобы сетевая камера записывала свои файлы не на то место, что использует USB-камера.

target_dir /home/ian/public_html/webcam/usb_cam

Нажмите Ctrl+C, чтобы остановить запущенный Motion, и перезагрузите его:

motion -c ~/.motion/motion.conf

Теперь вы должны видеть статические картинки и видео с вашей сетевой камеры.

Часть 3 Уточнение результатов

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

Параметры обнаружения движения по умолчанию хорошо работают в большинстве случаев, однако вполне возможно, что в контролируемой зоне может быть дорога или, например, деревья. Движение в этих областях сгенерирует событие и приведет к большому количеству ложных тревог. Чтобы избежать их, применим mask_file, определяющий области, где движения можно игнорировать. Маска – это файл PGM (portable graymap), который должен быть одинаковой высоты и ширины с захваченным кадром. Область, где вам не нужны срабатывания датчика движения, должна быть зачернена, а место, где они требуются, должно быть белым.

Файл маски легко создать, взяв захваченный кадр с web-камеры и отредактировав его в GIMP. На рисунке в начале есть деревце на переднем плане, которое вызовет срабатывание при раскачивании их ветром. Я запустил GIMP и отредактировал это изображение для создания файла маски, показанного справа. Можно видеть, что мы исключили из рассмотрения область, содержащую растения, заполнив ее черным цветом. Оставшаяся часть изображения, где мы хотим, чтобы движение обнаруживалось, должна быть заполнена белым. Сохраните изображение как файл PGM в GIMP.

Теперь велим Motion использовать файл маски. В thread.conf соответствующей web-камеры отредактируйте опцию mask_file:

mask_file /home/ian/webcam/my_mask_file.pgm

Можно также указать, сколько последовательных кадров должно содержать движение, чтобы Motion распознал его как реальное. Этот параметр определяется с помощью minimum_motion_frames и по умолчанию равен 1. Чувствительность детектирования также можно скорректировать через параметр threshold в файле конфигурации. Он определяет количество пикселей, которые должны измениться, прежде чем будет засчитано движение. По умолчанию используется значение 1500.

Оповещение по e-mail

Motion умеет запускать внешние команды при обнаружении движения и связанных с ним событий. Имеющиеся события приведены в таблице. Вы можете указать скрипту на события в motion.conf или соответствующем файле thread.conf. Обнаружив движение, Motion создает MPEG-файл событий. Кроме того, он создает JPEG-файл с одним из видеокадров. Момент в процессе движения, когда создается JPEG-файл, настраивается с помощью опции output_normal в файле thread.conf. Установка ее в best сохранит изображение с наибольшим изменением пикселей по ходу события.

События можно использовать для отправки оповещений по электронной почте c прикрепленными JPEG- или MPEG-файлами. Так как MPEG-файлы бывают довольно велики, возможно, лучше всего будет отправить файл JPEG, показывающий изображение с наибольшим изменением пикселей (около 50 КБ), иначе вас завалит спамом из видео вашей кошки, резвящейся перед web-камерой.

Для отправки e-mail-оповещения с прикрепленным JPEG-файлом употребим Mutt. Сперва установим его:

sudo apt-get install mutt

Теперь надо создать сценарий оболочки для отправки JPEG-файла. На Wiki Motion говорится, что в обработчике события можно использовать местозаменитель %f, куда подставится имя файла, однако в версии программы, поставляемой с Ubuntu Hardy, это не сработало. Для отправки JPEG мы будем использовать событие on_event_end.

Заметьте, что jpeg_filename (имя файла для отправки) определено в нашем thread.conf. Формат имени файла, передаваемого в обработчик события on_end_event, должен соответствовать таковому в jpeg_filename. Обратитесь к Wiki Motion для получения детальной информации о местозаменителях, допустимых в именах файлов.

Отредактируем thread.conf, соответствующий нашей камере:

jpeg_filename %v-%Y%m%d%H%M%S-%q
on_event_end send_mail ~/scripts/email_alert.sh / “/home/ian/public_html/webcam/linksys/%v-%Y%m%d%H%M%S-%q”

Осталось создать скрипт email_alert.sh в нашем любимом редакторе. Не забудьте сделать его исполняемым:

#!/bin/sh
#Destination e-mail address
TO=”ian@firewall.banter.local”
#Subject of the e-mail
SUBJECT=”Motion detected”
echo ‘Email body text goes here’ | mutt -a $1 -s $SUBJECT $TO

В скрипте $1 заменяется именем JPEG-файла, передаваемого обработчиком события Motion. LXF

И это еще не все...

Отправка сообщений о вторжении – не единственная возможность: Motion может держать вас в курсе событий с помощью смеси собственного встроенного web-сервера, PHP и FTP. Чтобы узнать, как этого добиться, см. продолжение учебника на http://www.linuxformat.ru/mag/webcam.txt.

Ссылки

Таблица событий

Функция Опции Аргументы
Запуск события (первое движение) on_event_start нет
Конец события (нет движения в течение нескольких секунд) on_event_end нет
Запись статического изображения on_picture_save Имя файла изображения
Старт записи видео on_movie_start Имя видеофайла
Окончание записи видео on_movie_end Имя видеофайла
Детектирование движения (каждый одиночный кадр с обнаруженными Motion изменениями) on_motion_detected нет
Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию