Установка Motion на Linux Ubuntu
В двух словах, сервер Motion позволяет записывать видео с IP-камер и предоставить доступ его просмотру посредством веб-интерфейса.
Установка и запуск
Motion в Ubuntu устанавливается из репозитория:
apt-get install motion
Создаем каталог и файл для логов motion:
Редактируем владельца для лог-файла:
chown motion:motion /var/log/motion/motion.log
В нем либо не должно быть параметра start_motion_daemon, либо он должен иметь значение:
Разрешаем автоматический запуск демона и перезапускаем сервис:
systemctl enable motion
systemctl restart motion
Можно проверить, что сервис работает корректно:
systemctl status motion
Настройка веб-интерфейса
По умолчанию, веб-интерфейс motion запускается на адресе localhost, что означает, что он будет доступен только с локального компьютера, что не совсем удобно для сервера.
Открываем конфигурационный файл:
Редактируем следующие строки:
webcontrol_localhost off
.
stream_localhost off
systemctl restart motion
Зайти на веб-интерфейс можно по адресу http://192.168.0.15:8080 для управления конфигурацией сервера, и http://192.168.0.15:8081 для подключения к трансляции в реальном времени (где 192.168.0.15 — адрес сервера с установленным motion).
Добавление камер
Добавим несколько камер. Для этого сначала открываем конфигурационный файл:
Добавляем строки с описаниями камер (для каждой камеры свой файл с настройками):
camera /etc/motion/camera1.conf
camera /etc/motion/camera2.conf
* до версии 3.4.1 вместо camera используется thread.
Теперь создаем данные файлы:
width 1920
height 1080
framerate 20
netcam_url http://192.168.0.15/video
netcam_userpass login:password
text_left CAMERA 1\nStreet 1
target_dir /video/motion/cam1
threshold 2000
lightswitch_percent 60
minimum_motion_frames 5
event_gap 10
locate_motion_mode on
locate_motion_style redbox
text_changes on
* до версии 4.1.1 вместо lightswitch_percent используется lightswitch.
. и для второй камеры:
width 1280
height 768
framerate 20
netcam_url rtsp://192.168.0.16:554/user=admin&password=&channel=1&stream=1.sdp
text_left CAMERA 2\nStreet 2
target_dir /video/motion/cam2
threshold 2000
lightswitch_percent 60
minimum_motion_frames 5
event_gap 10
locate_motion_mode on
locate_motion_style redbox
text_changes on
ffmpeg_timelapse 1
* первая камера настроена на запись при движении, видеопоток берем посредством http-запроса. Вторая — на запись при движении + посекундная постоянная запись, видеопоток забираем с использованием RTSP.
XMEYE “Motion Detect” Детекция движения
Данную опцию поддерживают любые XMEYE видеокамеры.
Настройка функции находиться в меню intellegent Alarm.
Если у камеры есть функции » Детекция человека «, или «Детекция лиц», обычная детекция движения будет работать только когда обе эти функции отключены, поскольку их включение заменяет ее.
Channel 1 — настройка первого канала (камеры № 1)
Human detect — отключена, чтобы активировать режим обычной детекции движения (Motion Detect).
Record — создавать отдельные «тревожные записи» в памяти.
Mobile Report — отправлять уведомление о тревоге в мобильное приложение XMEYE
Alarm Sound — Звуковое оповещение о тревоге на видеорегистраторе. Можно подключить обычные компьютерные колонки по стандартному 3,5 аудио разъему к регистратору.
Sensitivity — уровень чувствительности.
«Region: Set» это настройка зоны действия детекции движения:
Отмечаем красным цветом зону, в которой будет работать тревога.
Собственно логика данной системы очень простая — идет сравнение нового кадра с предидущими, в случае, если в новом кадре есть заметные изменения, активируется тревога, чувствительность регулируем в пункте Sensetive.
Собственно где мы можем использовать данную охрану?
Например в помещении, когда в нем никого нет, нет никаких животных, можно использовать систему, как альтернативу датчику движения.
На улице сложно придумать, как она может быт полезна, учитывая, что тревога будет срабатывать от любого движения (ветер колышет деревья, может пролететь какой-то пакет, бегать коты/собаки, могут резко появиться тени, или блики при восходе, или закате солнца). В теории можно расположить камеру так, чтобы несколькими квадратами выделить автомобиль, и получим тревогу, если он пропадет, или кто-то будет тереться возле авто.
В общем можно экспериментировать с уровнем чувствительности и придумывать свои сценарии, но Детекция человека более универсальная и надежная охрана, которая практически исключает ложные срабатывания.
Detect motion status что это
Видеонаблюдение в 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, настраивается через конфиг-файлы. На этом варианте я и остановился.
Оборудование необходимое для видео-слежения:
Устанавливаем motion
В Ubuntu 8.10\9.04 программа и все сопутствующие модули есть в репозитариях. Так что установка программы производиться в одну строчку в консоли и в 1 минуту ожидания.
sudo aptitude install motion
После того как установка произведена, вы можете приступить к настройке программы. В моем случае это захват видео с устройства при фиксации движения в кадре. Т.е. запись в файл начинается только в том случае, если motion фиксирует движение, очень удобно, так как это не съест все ваше свободное пространство на винте, да не будет надобности просматривать пустые фильмы.
Конфиг файл находиться в /etc/motion/motion.conf
Открываем его текстовым редактором gedit.
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
# 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
Смотрим на вывод, там не должно быть слов 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-камеру можно прочесть подробно и с картинками тут
Немного про интерфейс
Сам интерфейс минималистичен и прост, но есть все необходимое, скрин ниже (изображения с камер, конечно же, размыты).
Видеонаблюдение и запись
Все настройки выложу скринами, там все просто и не требует в принципе каких-либо знаний (у каждого пункта настроек есть tooltip с подсказкой что это, и зачем). Кликаем на изображения, чтобы увидеть все.
Давайте, для начала, придадим камерам в HomeBridge молниеносную скорость получения скриншотов. Чтобы видеть текущее изображение сразу, как только открыли камеру (и ждете загрузку стрима) в HomeKit на просмотр или просто комнату с камерой, просто добавляем/заменяем в конфиге камеры одну строчку и перезагружаем HomeBridge.
А теперь, при помощи команды телеграм-боту в Node-Red (я использую node-red-contrib-telegrambot т.к. в нем предусмотрена возможность использования socks), отправим текущий скриншот, и заодно ссылку на онлайн-стрим, чтобы не выходя из телеграма можно было, при необходимости, посмотреть, что происходить в real-time.
Вот так выглядит флоу:
А само флоу для экспериментов (вы можете, например, встроить его в свои автоматизации node-red, используя со 2 по 4 ноду) доступно по ссылке. Импортируйте себе и эксперементируйте на здоровье =)
Как итог, я использую MotionEye уже около полугода, и за это время у меня не возникло ни одной претензии к нему и он ни разу не «упал» и не заглючил. Если придумаете для MotionEye другие кейсы, делитесь в комментариях =)
Делаем детектор движения, или OpenCV — это просто
Надо оправдывать название компании — заняться хоть чем-то, что связано с видео. По предыдущему топику можно понять, что мы не только чайник делаем, но и пилим «умное освещение» для умного дома. На этой недели я был занят тем, что ковырял OpenCV — это набор алгоритмов и библиотек для работы с компьютерным зрением. Поиск обьектов на изображениях, распознание символов и все такое прочее. 
На самом деле что-то в ней сделать — не такая сложная задача, даже для не-программиста. Вот я и расскажу, как.
Сразу говорю: в статье может встретиться страшнейший быдлокод, который может вас напугать или лишить сна до конца жизни.
Если вам еще не страшно — то добро пожаловать дальше.
Введение
Собственно, в чем состояла идея. Хотелось полностью избавится от ручного включения света. У нас есть квартира, и есть люди, которые по ней перемещаются. Людям нужен свет. Всем остальным предметам в квартире свет не нужен. Предметы не двигаются, а люди двигаются(если человек не двигается — он или умер, или спит. Мертвым и спящим свет тоже не нужен). Соответственно, надо освещать только те места в квартире, где наблюдается какое-то движение. Движение прекратилось — можно через полчаса-час выключить свет.
Как определять движение?
О сенсорах
Можно определять вот такими детекторами: 
Называют они PIR — Пассивный Инфракрасный Сенсор. Или не пассивный, а пироэлектрический. Короче, в основе его лежит, по сути, единичный пиксель тепловизора — та самая ячейка, которая выдает сигнал, если на нее попадает дальний ик. 
Простая схема после нее выдает импульс только если сигнал резко меняется — так что на горячий чайник он сигналить не будет, а вот на перемещающийся теплый объект — будет.
Такие детекторы устанавливают в 99% сигнализаций, и вы их все думаю, видели — это те штуки, которые висят под потолком: 
Еще такие же штуки, но с обвязкой посложнее стоят в бесконтактных термометрах — тех, которые меряют температуру за пару секунд на лбу или в ухе. 
И в пирометрах, тех же термометрах, но с бОльши диапазоном: 
Хотя я что-то отвлекся. Такие сенсоры, конечно, штука хорошая. Но у них есть минус — он показывает движение во всем обьеме наблюдения, не уточняя где оно произошло — близко, далеко. А у меня большая комната. И хочется включать свет только в той части, где работает человек. Можно было, конечно поставить штук 5 таких сенсоров, но я отказался от этой идеи — если можно обойтись одной камерой примерно за такую же сумму, зачем ставить кучу сенсоров?
Ну и OpenCV хотелось поковырять, не без этого, да. Так что я нашел в закромах камеру, взял одноплатник(CubieBoard2 на A20) и поехало.
Установка
Естественно, для использования OpenCV сначала надо поставить. В большинстве современных систем(я говорю про *nix) она ставится одной командой типа apt-get install opencv. Но мы же пойдем простым путем, да? Да и например в системе для одноплатника, которую я использую ее нету.
Исчерпывающее руководство по установке можно найти вот тут, поэтому я не буду очень подробно останавливаться на ней.
Ставим cmake и GTK(вот его я как раз со спокойной совестью поставил apt-get install cmake libgtk2.0-dev).
Идем на офсайт и скачиваем последнюю версию. А вот если мы полезем на SourceForge по ссылке из руководства на Robocraft, то скачаем не последнюю версию(2.4.6.1), а 2.4.6, в которой абсолютно неожиданно не работает прием изображения с камеры через v4l2. Я этого не знал, поэтому 4 дня пытался заставить работать эту версию. Хоть бы написали где-то.
Дальше — стандартно:
Можно собрать примеры, которые идут в комплекте:
Собственно, большая часть моего кода взята из примера под названием motempl — это как раз и есть программа, реализующая функционал определения движения в кадре. Выглядит это вот так:
Допилка
Работает, но как это применить для включения света? Он показывает движение на экране, но нам-то надо, чтобы об этом узнал контроллер, который у нас управляет освещением. И желательно, чтобы он узнал не координаты точки, а место, в котором надо включить свет.
Для начала, немного поймем, как же эта штука работает. Чтобы показать видео с камеры в окошке, многое не требуется:
Эту программу можно скопировать в файл test.c и собрать его вот так:
Опять же, честно говоря, я не совсем понимаю, что именно делает эта команда. Ну собирает. А почему именно такая?
Оно запустится, и покажет вам видео с камеры. Но из него даже не получится выйти — программа застряла в бесконечном цикле и только Ctrl+C прервет ее бессмысленную жизнь. Добавим обработчик кнопок:
Теперь у нас есть программа, которая показывает видео с камеры. Нам надо ей как-то указать те части экрана, в которых нужно определять движение. Не ручками же их в пикселях задавать.
Вот как оно работает:
Регионы переключаются цифровыми кнопками.
Но не будем же мы каждый раз при запуске программы устанавливать регионы наблюдения вручную? Сделаем сохранение в файл.
Привязываем эти функции, например на кнопки w и r, и при нажатии их сохраняем и открываем массив.
Осталась самая малость — собственно, определение в каком регионе произошло движение. Переносим наши наработки в исходник motempl.с, и находим куда нам можно вклиниться.
Вот функция, которая рисует круги на месте обнаружения движения:
А координаты центра определяются вот так:
Вставляем в этот кусок свой код:
Осталось немного: направлять вывод не в консоль, а в UART, подключить к любому МК реле, которые будут управлять светом. Программа обнаруживает движение в регионе, отправляет номер региона контроллеру, а тот зажигает назначенную ему лампу. Но об этом — в следующей серии.
Исходник проекта я выложил на github, и буду не против, если кто-нибудь найдет время для исправления ошибок и улучшения программы:
github.com/vvzvlad/motion-sensor-opencv
Напоминаю, если вы не хотите пропустить эпопею с чайником и хотите увидеть все новые посты нашей компании, вы можете подписаться на на странице компании(кнопка «подписаться»)
И да, я опять писал пост в 5 утра, поэтому приму сообщения об ошибках. Но — в личку.







