google
Апр 03 2009

Видеонаблюдение в Linux с помощью системы обнаружения движения Motion

Сама по себе идея видео-наблюдения думаю интересует многих. Всегда интересно знать, что происходит в ваше отсутствие на рабочем месте, в офисе, дома в саду. Если подойти к вопросу серьезно, то окажется, что путей решения очень много. Причем, что радует как в Windows так и в Linux. Например я гуляя по магазинам у себя в городе видел как минимум десяток совершенно разных систем реализованных вод Windows, обладающих красивым (»удобным»=ненужным) графическим интерфейсом и стоит все это кучу денег. Другой вопрос, это реализация полноценной системы видео-наблюдения под Linux. Выбор как это сделать, очень даже ничего. Вот из тех, что попались мне и понравились:

AVReg – Представляет собой программное обеспечение (software) для создания аудио/видео регистраторов на на базе персональных компьютеров и видеосерверов под управлением Linux. Распространяется в виде набора пакетов для некоторых основных дистрибутивов Linux.
К сожалению программа имеет не совсем свободную лицензию (license) однако даже вариант для некоммерческого использования с некоторыми урезанными функциями вполне хватит для домашнего использования. Плюс же этой системы в том, что она активно развивается и имеет огромное количество надстроек, графический интерфейс, проект русский так что вся документация на русском + подробные инструкции по настройке и установке.

ZoneMinder – так же мультиплатформенная проффесиональная система, тоже развивается, правда не так активно, все сопровождение и документация на английском, присутствует в репозитариях, и тянет за собой MySQL базу и http-сервер Apache.

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

Motion – Программа Motion способна контролировать сигнал, полученный с одной или нескольких видеокамер, и обнаруживать наличие изменений на картинке. На выходе получаем фотки в форматах jpeg, ppm или mpeg видеопоток, который может транслироваться в сеть или записываться в файл. Проект целиком и полностью свободный, сама программа существует только в виде демона что обеспечивает низкое ресурсо-потребление, имеет встроенный мини http-server (это позволяет смотреть видео в реальном времени в браузере на локальном компьютере или же другом компьютере в сети, интернете) и может работать с СУБД MsSQL, настраивается через конфиг-файлы. На этом варианте я и остановился.

Оборудование необходимое для видео-слежения:

  • Компьютер, ноутбук, домашний сервер
  • ОС GNU/Linux
  • Программа Motion + ffmpeg
  • Web-камера, камера в ноутбуке, профессиональная камера.

Устанавливаем motion
В Ubuntu 8.10\9.04 программа и все сопутствующие модули есть в репозитариях. Так что установка программы производиться в одну строчку в консоли и в 1 минуту ожидания.

1
sudo aptitude install motion

После того как установка произведена, вы можете приступить к настройке программы. В моем случае это захват видео с устройства при фиксации движения в кадре. Т.е. запись в файл начинается только в том случае, если motion фиксирует движение, очень удобно, так как это не съест все ваше свободное пространство на винте, да не будет надобности просматривать пустые фильмы.
Конфиг файл находиться в /etc/motion/motion.conf
Открываем его текстовым редактором gedit.

1
sudo gedit /etc/motion/motion.conf

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

—————————————————————————————————————————————————————————–

# Start in daemon (background) mode and release terminal (default: off)
#Стартовать как демон, этот параметр можно поставить в on, по умолчанию он в off
daemon on

# Videodevice to be used for capturing (default /dev/video0)
# for FreeBSD default is /dev/bktr0
#В Линукс ваше видео устройство для захвата должно быть по умолчанию /dev/video0 если вы имеете несколько то соответственно /dev/video1 /dev/video2 и т.д.
videodevice /dev/video0

# The video input to be used (default: 8 )
# Should normally be set to 0 or 1 for video/TV cards, and 8 for USB cameras
#Используемый вход для видео этот параметр не трогать
input 8

# Image width (pixels). Valid range: Camera dependent, default: 352
#Разрешение вашего видео тут как вам нравиться 320х240, 640х480 …
width 640

# Image height (pixels). Valid range: Camera dependent, default: 288
height 480

# Maximum number of frames to be captured per second.
# Valid range: 2-100. Default: 100 (almost no limit).
# Устанавливаем количество захватываемых кадров в секунду;
framerate 30 (30 в самый раз)

# Gap is the seconds of no motion detection that triggers the end of an event
# An event is defined as a series of motion images taken within a short timeframe.
# Recommended value is 60 seconds (Default). The value 0 is allowed and disables
# events causing all Motion to be written to one single mpeg file and no pre_capture.
#gap отвечает за длину ролика который будет храниться в
gap 60

# Maximum length in seconds of an mpeg movie
# When value is exceeded a new mpeg file is created. (Default: 0 = infinite)
#ОЧЕНЬ ВАЖНЫЙ ПАРАМЕТР!
Чтобы захваченный файл не был большим, его продолжительность можно ограничить параметром max_mpeg_time, указав в качестве значения время в секундах. По умолчанию «0» это значит что motion будет писать все видео в независимости есть движение или нет. Это не очень круто!

max_mpeg_time 120

# Output ‘normal’ pictures when motion is detected (default: on)
# Valid values: on, off, first, best, center
# When set to ‘first’, only the first picture of an event is saved.
# Picture with most motion of an event is saved when set to ‘best’.
# Picture with motion nearest center of picture is saved when set to ‘center’.
# Can be used as preview shot for the corresponding movie.
#Это параметр указывает какой скриншот с движением сохранить, по умолчанию стоит на on это не круто так как он будет сейвить все подряд, по истечении 1 часа у вас их будет 10000~
по этому ставим или best (лучший), или first (первый)

output_normal best

# Output pictures with only the pixels moving object (ghost images) (default: off)
#ничего не трогаем!
output_motion off

# Use ffmpeg to encode mpeg movies in realtime (default: off)
#ВАЖНЫЙ ПАРАМЕТР! Так как именно он указывает motion что нада сохранять видео
на нужно именно видео, по дефолту стоит off переключаем на on

ffmpeg_cap_new on

# Codec to used by ffmpeg for the video compression.
# Timelapse mpegs are always made in mpeg1 format independent from this option.
# Supported formats are: mpeg1 (ffmpeg-0.4.8 only), mpeg4 (default), and msmpeg4.
# mpeg1 – gives you files with extension .mpg
# mpeg4 or msmpeg4 – gives you files with extension .avi
# msmpeg4 is recommended for use with Windows Media Player because
# it requires no installation of codec on the Windows client.
# swf – gives you a flash film with extension .swf
# flv – gives you a flash video with extension .flv
# ffv1 – FF video codec 1 for Lossless Encoding ( experimental )
# mov – QuickTime ( testing )
#тут большая запарка, так как если ставить кодек mpeg4 или mpeg1 после запуска motion вам радостно сообщит что не может найти кодек в системе, этот вопрос решается по разному, самый простой способ, это установить кодек ffv1 записать пару минут видео и открыть с помощью Totem, который сообщит что не может проиграть файл и автоматически найдет нужный кодек, вам останеться кликнуть ок, дождаться загрузки, и вууаля, видео будет классно проигрыватсья и никаких проблем.
ffmpeg_video_codec ffv1

# Target base directory for pictures and films
# Recommended to use absolute path. (Default: current working directory)
#здесь укажите каталог куда бы вы хотели что-бы сохранялось видео и скрины.
target_dir /home/booch/new

# The mini-http server listens to this port for requests (default: 0 = disabled)
#Это ваш порт на localhost ничего трогать не нада.
webcam_port 8081

# Quality of the jpeg images produced (default: 50)
#По вкусу
webcam_quality 50

# Output frames at 1 fps when no motion is detected and increase to the
# rate given by webcam_maxrate when motion is detected (default: off)
#ставим 20, это оптимальное значение, по дефолту off — это не хорошо
webcam_motion 20

# Maximum framerate for webcam streams (default: 1)
#та же история по дефолту 1, ставим 20 — что есть нормально
webcam_maxrate 20

# Restrict webcam connections to localhost only (default: on)
#НЕ ТРОГАТЬ!
webcam_localhost on

—————————————————————————————————————————————————————————–
И так запускаем motion (с правами рута обязательно)

1
sudo motion -n

Смотрим на вывод, там не должно быть слов error, missing, fatal, signature, cannot find codec, ошибка, cannot save и т.д. Зато должны быть оповещающие вас о том, что запущен мини http-server, и некоторая техническая информация.
Теперь откройте браузер и введите в адресной строке http://localhost:8081/
8081 — это наш порт (смотри конфиг)
localhost — так как видео транслируется на локальную машину, для трансляции видео на машину в сети значение нужно менять (смотри конфиг)

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

Теперь ваша камера четко палит за происходящим, если в ее поле зрение попадает движущийся объект то сразу стартует запись, после того как объкт отвалил, запись продолжается 120 секунд, далее ролик не пишется, т.е. Не отъедает место на винте. Короче говоря motion начинает писать только в случае обнаружения движения.

Выглядеть это должно примерно так

Возможности
Для настройки видео наблюдения у себя на системе я использовал камеру ноутбука, если же вы имеете внешнию USB-камеру это еще лучше, купив к ней провод вы можете закрепить ее там, где вам понравиться, в 90% случаях любая современная камера без проблем будет определена Ubuntu 9.04\8.10 если же вы надумали покупать, то лучше в сети ознакомтесь с тем, какие камеры не имееют проблем при работе в Linux.

Возможности motion ограничены только вашей фантазией, при необходимости можно настроить выполнение любой команды или скрипта при выполнении заданного вами условия (например обнаружения движения) Кто читал внимательно, увидел слово скрипт, кто знает, что такое скрипт уже прокрутил в голове 1001 вариант. Вы можете настроить отправку электронной почты, отпарвку сообщения в аську, отправку СМС на мобильник и даже настроить возможность того, что-бы система звонила вам через Asterisk или включала звуковую тревогу.

Дополнительный материал по общим моментам можно найти здесь
Как подготовить Web-камеру можно прочесть подробно и с картинками тут
Мой рабочий конфиг motion.conf

Viewed 5629 times by 2984 viewers

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

  • By i.surzhenko, 4 Апрель 2009 @ 21:24

    Ну, я, как человек имеющий отношение к видеонаблюдению, скажу, что USB камеры никогда(!!!) не используются в видеонаблюдении (имеется в виду на уровне реальных решений). Для этого используются специальные камеры, которые либо выдают аналоговый сигнал (тогда Вам нужна будет карта видеозахвата или так называемый Network Video Recoder, который оцифровывает сигнал и вещает RTSP или иным поддерживаемым потоком в Вашу сеть) или так называемая IP-камера, которая вобщем-то представляет собой камеру и NVE в одном флаконе.

    Резонный вопрос: а в чем разница?

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

    Посему, если кто-либо задумается над организацией видеонаблюдения у себя дома, то рекомендую обратиться в соответствующие конторы для выбора железа. :)

  • By vkontakte.ru admin, 5 Апрель 2009 @ 0:47

    Тут ты совершенно прав, видно что разбираешься, но для дома можно юзать хорошего качества Web-камеры с 5-10 метровым USB шнурком, это терпимо. Я вот даже свой ноутбук для этого приспособил :-) и второй тоже, т.е. по сетке получается две камеры, охват что нада, враг не пройдет ))))

    Если же делать что-то серьезное то снова ты прав, нужна нормальная камера с диодной подсветкой + плата видеозахвата + все это надо завести на Linux. Но ведь тем интереснее.

    Кстати вы юзаете Linux для видеонаблюдения? Если да, то вы можете предоставить намного более интересный-профессиональный материал читателям нежели я.

  • By i.surzhenko, 7 Апрель 2009 @ 0:03

    На данный момент, увы, нет. Я пытался дать понять начальству, что искать в Microsoft стабильность и производительность – безсмысленное занятие, но результат отрицательный. Действительно, основная проблема при разработке таких решений, как правило связана либо с производительностью, либо со стабильностью. Для того, чтобы рядовой читатель осознал суть, приведу одну очень показательную техническую характеристику:
    Одна карта видеозахвата в состоянии оцифровывать до 480 кадров в секунду (16 каналов по 30 кадров в секунду). Это в 15 раз больше, чем при просмотре обычного фильма. Иными словами, если при просмотре фильма ваш плеер тратит 5 процентов процессорного времени для декодирования фильма, то для декодирования потоков с карты видеозахвата понадобится уже 75 процентов + дополнительные расходы на синхронизацию. Тут приходится оптимизировать всё.
    Увы, ОС Windows (особенно не серверные варианты) очень плохо приспособлены к таким потокам информации. Возникает очень много проблем.
    Вобщем-то моё руководство сейчас потихоньку приходит к этому пониманию, но процесс идет не столь быстро, как этого хотелось бы.

    Да… Тут вспомнилось… Очень забавно было наблюдать, как фирмы (читай лидеры СНГшного рынка в области видеонаблюдения) проводили меряние «конечностями» :) на предмет того, чья система быстрее выходит из крэша :)

    Вобщем, я могу рассказать про само видеонаблюдение, но не про Linux в нем. Увы :(

  • By wm-ecomers.ru, 29 Август 2009 @ 21:33

    Отличная статья. сделал все слово в слово. но при запуске в терминале выдает что adress allreade use то есть адресок лосалност 8081 уже занят. хотя показывается картинка (серый фон и дата). как можно исправить?
    да и никаких файлов не пишет

  • By vkontakte.ru admin, 29 Август 2009 @ 23:14

    У меня тоже так писало, скорее всего у тебя на данном порту уже что-то висит, например Apache или nginx, есть много программ которые имеют Web-интерфейс, может mpd или какой нибудь торрент клиент.
    Можешь в конфиге для motion просто указать другой порт, и после соответственно в браузере вводить не 8081 и к примеру 3000

  • By Sykes31Kitty, 25 Июнь 2010 @ 11:36

    Every body understands that men’s life seems to be very expensive, however we need cash for different things and not every one earns big sums money. Thence to get some credit loans or student loan should be a proper solution.

  • By Роман, 8 Июль 2010 @ 16:29


    [0] Processing thread 0 - config file /etc/motion/motion.conf
    [0] Motion 3.2.11 Started
    [0] ffmpeg LIBAVCODEC_BUILD 3412993 LIBAVFORMAT_BUILD 3415808
    [0] Thread 1 is from /etc/motion/motion.conf
    [0] motion-httpd/3.2.11 running, accepting connections
    [0] motion-httpd: waiting for data on port TCP 8080
    [1] Thread 1 started
    [1] cap.driver: "saa7134"
    [1] cap.card: "AverMedia AverTV Studio 505"
    [1] cap.bus_info: "PCI:0000:01:07.0"
    [1] cap.capabilities=0x05010015
    [1] - VIDEO_CAPTURE
    [1] - VIDEO_OVERLAY
    [1] - VBI_CAPTURE
    [1] - TUNER
    [1] - READWRITE
    [1] - STREAMING
    [1] Supported palettes:
    [1] 0: GREY (8 bpp gray)
    [1] 1: RGBO (15 bpp RGB, le)
    [1] 2: RGBQ (15 bpp RGB, be)
    [1] 3: RGBP (16 bpp RGB, le)
    [1] 4: RGBR (16 bpp RGB, be)
    [1] 5: BGR3 (24 bpp RGB, le)
    [1] 6: RGB3 (24 bpp RGB, be)
    [1] 7: BGR4 (32 bpp RGB, le)
    [1] 8: RGB4 (32 bpp RGB, be)
    [1] 9: YUYV (4:2:2 packed, YUYV)
    [1] 10: UYVY (4:2:2 packed, UYVY)
    [1] 11: 422P (4:2:2 planar, Y-Cb-Cr)
    [1] 12: YU12 (4:2:0 planar, Y-Cb-Cr)
    [1] Selected palette YU12
    [1] index_format 8 Test palette YU12 (320x240)
    [1] Using palette YU12 (320x240) bytesperlines 480 sizeimage 115200 colorspace 00000000
    [1] found control 0x00980900, "Brightness", range 0,255
    [1] "Brightness", default 128, current 128
    [1] found control 0x00980901, "Contrast", range 0,127
    [1] "Contrast", default 68, current 64
    [1] found control 0x00980902, "Saturation", range 0,127
    [1] "Saturation", default 64, current 64
    [1] found control 0x00980903, "Hue", range -128,127
    [1] "Hue", default 0, current 0
    [1] found control 0x00000000, "42", range 0,0 !DISABLED!
    [1] "42", default 0, current 0
    [1] found control 0x00000000, "42", range 0,0 !DISABLED!
    [1] "42", default 0, current 0
    [1] found control 0x00000000, "42", range 0,0 !DISABLED!
    [1] "42", default 0, current 0
    [1] found control 0x00000000, "42", range 0,0 !DISABLED!
    [1] "42", default 0, current 0
    [1] found control 0x00000000, "42", range 0,0 !DISABLED!
    [1] "42", default 0, current 0
    [1] found control 0x00000000, "42", range 0,0 !DISABLED!
    [1] "42", default 0, current 0
    [1] found control 0x08000000, "Invert", range 0,1
    [1] "Invert", default 0, current 0
    [1] found control 0x08000001, "y offset odd field", range 0,128
    [1] "y offset odd field", default 0, current 0
    [1] mmap information:
    [1] frames=4
    [1] 0 length=118784
    [1] 1 length=118784
    [1] 2 length=118784
    [1] 3 length=118784
    [1] Error starting stream VIDIOC_STREAMON:
    [1] ioctl(VIDIOCGMBUF) - Error device does not support memory map
    [1] V4L capturing using read is deprecated!
    [1] Motion only supports mmap.
    [1] Could not fetch initial image from camera
    [1] Motion continues using width and height from config file(s)
    [1] Resizing pre_capture buffer to 1 items
    [1] Started stream webcam server in port 8081
    [1] Retrying until successful connection with camera
    [1] cap.driver: "saa7134"
    [1] cap.card: "AverMedia AverTV Studio 505"
    [1] cap.bus_info: "PCI:0000:01:07.0"
    [1] cap.capabilities=0x05010015
    [1] - VIDEO_CAPTURE
    [1] - VIDEO_OVERLAY
    [1] - VBI_CAPTURE
    [1] - TUNER
    [1] - READWRITE
    [1] - STREAMING
    [1] Supported palettes:
    [1] 0: GREY (8 bpp gray)
    [1] 1: RGBO (15 bpp RGB, le)
    [1] 2: RGBQ (15 bpp RGB, be)
    [1] 3: RGBP (16 bpp RGB, le)
    [1] 4: RGBR (16 bpp RGB, be)
    [1] 5: BGR3 (24 bpp RGB, le)
    [1] 6: RGB3 (24 bpp RGB, be)
    [1] 7: BGR4 (32 bpp RGB, le)
    [1] 8: RGB4 (32 bpp RGB, be)
    [1] 9: YUYV (4:2:2 packed, YUYV)
    [1] 10: UYVY (4:2:2 packed, UYVY)
    [1] 11: 422P (4:2:2 planar, Y-Cb-Cr)
    [1] 12: YU12 (4:2:0 planar, Y-Cb-Cr)
    [1] Selected palette YU12
    [1] index_format 8 Test palette YU12 (320x240)
    [1] Using palette YU12 (320x240) bytesperlines 480 sizeimage 115200 colorspace 00000000
    [1] found control 0x00980900, "Brightness", range 0,255
    [1] "Brightness", default 128, current 128
    [1] found control 0x00980901, "Contrast", range 0,127
    [1] "Contrast", default 68, current 64
    [1] found control 0x00980902, "Saturation", range 0,127
    [1] "Saturation", default 64, current 64
    [1] found control 0x00980903, "Hue", range -128,127
    [1] "Hue", default 0, current 0
    [1] found control 0x00000000, "42", range 0,0 !DISABLED!
    [1] "42", default 0, current 0
    [1] found control 0x00000000, "42", range 0,0 !DISABLED!
    [1] "42", default 0, current 0
    [1] found control 0x00000000, "42", range 0,0 !DISABLED!
    [1] "42", default 0, current 0
    [1] found control 0x00000000, "42", range 0,0 !DISABLED!
    [1] "42", default 0, current 0
    [1] found control 0x00000000, "42", range 0,0 !DISABLED!
    [1] "42", default 0, current 0
    [1] found control 0x00000000, "42", range 0,0 !DISABLED!
    [1] "42", default 0, current 0
    [1] found control 0x08000000, "Invert", range 0,1
    [1] "Invert", default 0, current 0
    [1] found control 0x08000001, "y offset odd field", range 0,128
    [1] "y offset odd field", default 0, current 0
    [1] mmap information:
    [1] frames=4
    [1] 0 length=118784
    [1] 1 length=118784
    [1] 2 length=118784
    [1] 3 length=118784
    [1] Error starting stream VIDIOC_STREAMON:
    [1] ioctl(VIDIOCGMBUF) - Error device does not support memory map
    [1] V4L capturing using read is deprecated!
    [1] Motion only supports mmap.

    Показывает лишь серую картинку, как исправить?
    как выставить входной канал Composite2

  • By Роман, 8 Июль 2010 @ 17:24

    Изменил в строке input значение с 8 на Composite2.
    Появились помехи, но изображения все так же нет, при этом в tvtime все работает нормально.

  • By Роман, 8 Июль 2010 @ 18:23

    Ну вот, не много времени прошло, и у меня все получилось))
    достаточно было выбрать 2ой канал, все работет, записывает.

    В общем, спасибо большое за статью!!!!

  • By vkontakte.ru admin, 11 Июль 2010 @ 21:22

    Иногда нужно только немного покопаться :-)

  • By google.com Антон Рябов, 27 Июль 2010 @ 10:44

    Возможно ли сделать доступ с использованием авторизации http://ipcam:8081?

  • By vkontakte.ru Александр Бербер, 29 Июль 2010 @ 9:18

    Do you understand English ? I don’t have russian in the army. so my answer to you is YES! you can do authentication without any problem. it’s the same way that in apache.

    please open your config:
    # vi motion.conf

    and put there this line:
    http_authentication login:pass

    To read more about HttpAPI for motion try here
    http://www.lavrsen.dk/foswiki/bin/view/Motion/MotionHttpAPI

    Good luck!

Other Links to this Post

RSS-лента комментариев к этой записи. TrackBack URI

Оставить комментарий

CAPTCHA image