Как найти движение на видео

Есть ли программа для детектирования движения в видео?

Всем привет!
Есть камера которая смотрит вход на работу. Видит она следующие gmvg1n9uLNne92.jpg
Иногда мне нужно посмотреть кто и когда приходит на работу. Для этого я пересматриваю 4 часа видео в ускоренном темпе.
Решил что проще будет если видеоплеер сам будет находить движение и ставить видео на паузу или еще что нибудь, но не могу найти ничего подобного!
Подскажите существует ли такой софт?


  • Вопрос задан

    более трёх лет назад

  • 9564 просмотра

Попробуйте VLC плеер — кое-что он умеет из коробки

Используйте опцию командной строки:
vlc —video-filter=motion <файл>

Или менюшками.
Tools -> Effects and Filters -> Video Effects -> Advanced -> Motion Detect.

Пригласить эксперта


  • Показать ещё
    Загружается…

25 мая 2023, в 02:38

1000 руб./за проект

25 мая 2023, в 02:31

800 руб./за проект

25 мая 2023, в 01:56

1200 руб./за проект

Минуточку внимания

8 идей для применения трекинга в видеоредакторе VSDC

Этот пост для тех, кто хочет прокачать свои навыки монтажа и научиться применять отслеживание движения объектов на видео (motion tracking). В качестве видеоредактора, позволяющего работать с инструментом motion tracking, мы возьмём VSDC Pro.

Если вы никогда не слышали о VSDC, это многофункциональный видеоредактор, который набрал популярность за счёт своей бесплатной версии для Windows. Однако в этой статье мы будем говорить о модуле отслеживания движения объектов, доступном только в продвинутой версии программы VSDC Pro. Ниже мы расскажем о том, что такое модуль motion tracking, как он работает (спойлер: очень просто), а также приведём массу примеров, чтобы помочь вам с вдохновением.

Прежде чем начать, вы можете скачать VSDC на официальной странице. В установочном файле находится бесплатная версия редактора, с которой вы в любой момент сможете перейти на Pro (подписка на платную версию VSDC стоит всего $19.99 в год).

Поехали.

Что такое motion tracking?

В сфере монтажа motion tracking – это процесс отслеживания движения объекта в кадре. По окончании трекинга программа «запоминает» и сохраняет траекторию движения, чтобы потом применить её к объекту, которого изначально не было на видео: подписи, изображению, иконке, маске – буквально любому графическому элементу.

Скажем, вы редактируете видеозапись игры в футбол и хотите разместить стрелку над головой футболиста, чтобы зрителям было легче за ним следить. Поскольку игрок постоянно в движении, вам нужно, чтобы и стрелка двигалась вместе с ним – иначе в ней нет никакого смысла, верно? Это как раз тот случай, когда инструмент motion tracking придётся кстати. С технической точки зрения, всё, что вам нужно сделать, это отследить траекторию движения футболиста, добавить изображение стрелки, разместить её над головой игрока и наложить сохранённую траекторию.

Есть множество других примеров применения инструмента motion tracking. Чаще всего это необходимость «привязать» подпись или маску к движущемуся объекту на видео. Об этих примерах мы поговорим через несколько абзацев.

Сперва давайте на практике разберём пример с футболистом и пошагово воспроизведём его непосредственно в видеоредакторе VSDC Pro. Так вам будет понятна логика применения инструмента, и вы сможете использовать её для аналогичных задач.

Как отследить движение объекта на видео в VSDC Pro

Многие относят motion tracking к «продвинутому» уровню видеомонтажа. Начинающим пользователям сперва даже может показаться, что это очень сложно. Однако если вы всерьёз увлечены работой с видео, рано или поздно вам понадобится освоить этот инструмент, поскольку он незаменим в большом количестве ситуаций.

Кроме того, на практике всё гораздо проще, чем кажется. Ниже – пошаговая инструкция для тех, кто хочет научиться отслеживать объекты на видео с помощью VSDC Pro:

Шаг 1. Импортируйте видеофайл в VSDC.

How to create a movement map in the VSDC Motion Tracking tool

Шаг 2. Правой кнопкой мыши кликните по видео и в открывшемся меню выберите опцию «Создать карту движения». Во всплывающем окне вам необходимо будет подтвердить папку, в которой будет храниться карта. Для удобства вы можете дать карте название, затем нажмите «Сохранить».

Шаг 3. Обратите внимание, что в верхней части интерфейса активировалось меню Motion Tracker. На сцене же появилась рамка красного цвета с точкой в центре. Разместите рамку на сцене так, чтобы она полностью закрывала объект, движение которого вы хотите отследить. Нажмите «Начать анализ».

Шаг 4. По мере проигрывания видео будет вырисовываться траектория зелёного цвета – это и есть карта движения. Через пару шагов вы привяжете к ней изображение стрелки. Как только создание траектории завершится, проверьте её корректность и нажмите «Применить редактирование».

Object tracking path built by VSDC Motion Tracker

Шаг 5. Теперь самая интересная часть. Используйте комбинацию «Shift + I», чтобы импортировать изображение, для которого вы создавали карту движения. В нашем случае это изображение стрелки в формате .PNG с прозрачным фоном. Если вы не можете использовать сочетание клавиш, используйте зелёную кнопку «Вставить объект» в верхней части меню.

Шаг 6. Захватите изображение мышкой и разместите его в отправной точке, затем сделайте по нему двойной щелчок.

Шаг 7. Используйте сочетание «Shift + Alt +M», чтобы применить к добавленному объекту траекторию, выстроенную ранее (вместо сочетания клавиш вы можете воспользоваться кнопкой «Вставить объект» >> «Движение» >> «Карта движения»). Во всплывающем окне выберите название той карты, которую вы сохранили ранее, и нажмите «Ok».

How to assign a movement map to an image in VSDC Video Editor

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

На этом инструкционная часть закончена. Сохраните готовое видео на компьютер через вкладку «Экспорт проекта».

8 идей для применения инструмента motion tracking на видео

Пора применить знания на практике. Трекинг объектов широко используется как для творческих задач, так и для информирования зрителя с помощью контекстуальных подписей. Идеи можно подсмотреть и в блогах на YouTube, и в рекламе, и даже в кино.

Мы собрали 8 таких примеров, которые вы сможете легко повторить самостоятельно.

Пример первый. Применение цензуры к объекту на видео

Первый и самый распространённый пример – это добавление пиксельной маски на видео, чтобы скрыть какой-либо объект. Например, вам может понадобиться спрятать лицо человека, который не должен быть узнан, скрыть номер машины, название улицы или логотип.

<pОбычно, чтобы скрыть лицо на видео (при условии, что человек не двигается), достаточно простого фильтра, который доступен в бесплатной версии VSDC. Однако, если человек перемещается в кадре, единственный способ сделать так, чтобы цензурирующая маска перемещалась вместе с ним – применить инструмент motion tracking.

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

В видеоинструкции ниже подробно показано, как это сделать:

Если же вы хотите скрыть объект смайлом или картинкой, советуем найти изображение в формате .PNG с прозрачным фоном.

Пример второй. Текст, который двигается за выбранным объектом на видео

Отдельная большая тема (в которой будет целых 6 идей) – это трекинг текста на видео. Следуя логике, описанной выше, вы можете сделать так, чтобы текст двигался вслед за объектом, к которому он привязан. Текстом в вашем случае может быть заголовок, подпись, призыв к действию – практически что угодно.

Разместить текст можно как на объекте, так и рядом с объектом. Ниже – пошаговая инструкция:

  1. Импортируйте видео в VSDC и создайте карту движения, используя инструкцию в первой части статьи.
  2. Затем добавьте текст на видео. Вы можете сделать это непосредственно в редакторе. Воспользуйтесь комбинацией «Shift +T» или кнопкой «Вставить объект», чтобы создать текстовое поле. Наберите текст.
  3. Откорректируйте размер, стиль и шрифт текста, затем сделайте по нему двойной щелчок.
  4. Воспользуйтесь комбинацией «Shift + Alt + M», чтобы применить готовую карту движения к тексту.

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

1. Создайте анимированное интро для своего канала

Если вы работаете с серией роликов или ведёте свой канал, вы скорее всего используете фирменное интро в начале каждого видео. С помощью инструмента motion tracking вы можете добавить в интро текст, который будет двигаться вслед за логотипом или любым другим объектом. Текстом может быть, например, название канала, адрес вашего сайта или ник в Instagram.

2. Используйте трекинг для отображения текстовых сообщений

Узнали, откуда взят этот кадр? Это сериал «Шерлок», в котором motion tracking используется многократно для отображения текстовых сообщений, обозначения локаций, и визуализации размышлений самого Шерлока. Чтобы повторить эффект с сообщениями, всё что вам нужно сделать – это отследить движения телефона, а затем наложить полученную траекторию на текст сообщения.

Таким же образом вы можете визуализировать мысли и речь героя, если это актуально в вашем контексте.

3. Добавьте динамики во вступительные титры

Движущиеся титры в начале фильма помогают мгновенно привлечь внимание зрителя. Почему бы вам не добавить этот приём в свой арсенал? Несмотря на то, что для таких титров часто используется 3D-текст, вы можете просто скачать стильный шрифт из бесплатной библиотеки шрифтов и это уже добавит эффект кинематографичности. Для максимальной естественности вы можете применить к титрам эффект постепенного исчезания (fade out).

4. Пусть подписи движутся вместе с обозначенными объектами

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

Например, ниже – отрывок из рекламы спортивного браслета Fitbit. Создатели ролика применяют motion tracking к текстовым обозначениям сильных сторон продукта.

5. Подчеркните детали в продающих видео

Ещё одна ниша, в которой трекинг текста будет полезен – это ролики для бизнеса. Например, если вы снимаете видео о недвижимости, и вам необходимо донести большой объём информации до потенциального покупателя, гораздо удобнее сделать это с помощью контекстных подписей, каждая из которых будет принадлежать к конкретному объекту. Используйте этот приём, чтобы подчеркнуть цифры, даты и вообще любые данные, которые легче воспринимать визуально, чем на слух.

How to use motion tracking for real-estate videos

6. Сделайте видео из путешествий более информативными

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

Motion tracking в данном случае – идеальная техника, поскольку позволяет очень точно обозначить объекты на видео, даже если они находятся в отдалении и двигаются в кадре.

How to make travel videos more captivating with motion-tracked text

Прежде чем вы приступите к работе

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

  1. Когда вы размещаете рамку отслеживания движения поверх объекта, убедитесь в том, что объект полностью в ней находится. При этом не стоит стремиться к тому, чтобы рамка была «впритык». Программа сможет с более высокой точностью отследить траекторию движения объекта, если внутри рамки будут также присутствовать соседствующие цвета и формы, контрастирующие с отслеживаемым объектом.
  2. Если в какой-то момент карта движения идёт в ошибочном направлении или же программа и вовсе «теряет» объект из вида, вы можете откорректировать траекторию вручную. Для этого прочитайте нашу инструкцию о том, как работать с модулем отслеживания движения в VSDC.
  3. Наконец, не забывайте, что слой с объектом, который вы привязываете к карте движения, должен находиться поверх слоя с основным видео на таймлайне.

Готовы попробовать?

Тогда скачайте VSDC на свой компьютер и начинайте экспериментировать! За идеями загляните на наш канал на YouTube, а написать нам можно на Facebook.

Умный поиск событий в видеозаписях

С помощью функции Поиска записей, вы можете найти архивные записи, на которых было зафиксировано движение в определенной области кадра.

Функция доступна:

  • в личном кабинете на сайте;

  • в приложении Ivideon Client для ПК.

NB! Умный поиск событий доступен только для на тарифе с облачным хранением архива 30 и более дней.

Поиск доступен для следующих режимов записи в облако:

  • Постоянная запись.

  • Запись по детекции.

Поиск недоступен:

  • Для локального архива.

  • Для архива, загруженного в облако с помощью режима отложенной записи.

1. Поиск в личном кабинете

1. Откройте для просмотра выбранную камеру и нажмите кнопку Поиск в архиве:

d449c719954d21d92a60d1710441f1db.png

2. Задайте параметры поиска: область поиска, дату и временной период, а также чувствительность (чем она выше, тем более мелкие движения будут обнаружены).

3. Установив нужные параметры нажмите кнопку Найти записи:

f83c497d2abd92cabdfe34c2b93dd498.png

4. Найденные фрагменты будут отображены в виде списка коротких видеороликов, а также отмечены на шкале таймлайна жёлтым цветом:

  • кликните по карточке видеоролика, чтобы просмотреть один из них;

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

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

6af91d91094507e8e998821000b252a2.png

2. Поиск в Ivideon Client

Чтобы найти архивные записи с движением в определенной области:

1. Откройте просмотр с нужной камеры и в левом нижнем углу плеера нажмите Поиск записей.

9e3fb94b4a5e5d7749b6c7470ae256ba.png

2. В меню Настройки поиска задайте:

  • дату и интервал времени;

  • область поиска.

3. Чтобы повысить точность поиска, вы можете задать дополнительные параметры:

  • интенсивность движения — установите высокую интенсивность, чтобы отсеять незначительные движения;

  • продолжительность движения;

  • интервал склейки — если интервал между роликами меньше выбранного значения, то такие ролики будут объединены в один.

4. Нажмите Найти записи и дождитесь вывода результатов.

0bb63647fe686686f08a39dfcd3f6d6b.png

5. Найденные фрагменты видео будут отображены над окном просмотра. Чтобы начать просмотр, нажмите на нужное видео левой кнопкой мыши

537007b4131bf0e6b5b049d6efb07926.png

6. На временной шкале найденные фрагменты видео выделены желто-оранжевыми цветом. Чем темнее цвет, тем интенсивнее движение было в кадре.

4d7278c3e5974faa25bc05ccd0869276.jpg

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

С помощью этого небольшого приложения вы можете найти движение в записи с камеры видеонаблюдения или с видеорегистратора. Для этого вам не нужно просматривать запись целиком, просто укажите путь к видеофайлу.

Детектор движения для видеофайлов

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

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

OpenCV вместе с Raspberry Pi могут стать мощным инструментом для работы в различных приложениях, требующих производить обработку видео в реальном времени. В предыдущей статье на нашем сайте мы рассмотрели как транслировать видеопоток из системы видеонаблюдения в Raspberry Pi с помощью OpenCV и протокола RTSP – рекомендуем прочитать эту статью прежде чем переходить к данной статье. В данном проекте мы рассмотрим применение библиотеки OpenCV для обнаружения движения (Motion Detection) в видеопотоке, транслируемом в плату Raspberry Pi из системы видеонаблюдения (CCTV). Если у вас нет под рукой системы видеонаблюдения, на которой вы могли бы протестировать данный проект, то вместо нее можно использовать проект камеры видеонаблюдения на основе платы Raspberry Pi.

Внешний вид проекта обнаружения движения на видео с помощью Raspberry Pi и OpenCV

Мы напишем программу на python, которая будет одновременно мониторить 4 камеры системы видеонаблюдения (CCTV cameras) и обнаруживать на них движения. Если на изображении с какой либо из этих камер будет обнаруживаться движение, то Raspberry Pi будет автоматически переключаться на экран этой камеры и подсвечивать (выделять) место на изображении, на котором было зафиксировано движение. Это будет происходить в режиме реального времени, с задержкой 1,5 секунды. Также мы добавили звуковой сигнал тревоги, который будет подаваться с помощью зуммера при обнаружении движения. Но вы можете усовершенствовать данный проект, например, при обнаружении движения будет передаваться SMS на ваш телефон или отправляться E-mail на вашу электронную почту (похожий проект описан в этой статье).

Автор данного проекта (ссылка на оригинал приведена в конце статьи) использовал плату Raspberry Pi 3 B+ с установленной на нее Buster OS, но можно использовать и другие типы плат Raspberry Pi с другими операционными системами. Также автор проекта использовал OpenCV версии 4.1 – можно использовать и другие версии данной библиотеки, но не ниже 4.1.

Вы можете скомпилировать OpenCV на плату Raspberry Pi с помощью CMake (это займет несколько часов, но это более надежно для «тяжелых» проектов) или вы можете непосредственно установить ее с помощью установщика pip, используя следующие команды:

$ pip install opencvcontribpython==4.1.0.25

Если вы устанавливаете OpenCV с помощью pip, то вам необходимо будет установить еще ряд дополнений с помощью следующих команд:

$ sudo aptget install libavcodecdev libavformatdev libswscaledev libv4ldev

$ sudo aptget install libxvidcoredev libx264dev

$sudo aptget install libatlasbasedev gfortran

$ sudo aptget install libhdf5dev libhdf5serialdev libhdf5103

$ sudo aptget install libqtgui4 libqtwebkit4 libqt4test python3pyqt5

Также вы можете посмотреть все проекты на нашем сайте, в которых использовалась OpenCV.

Установка зуммера на 5-дюймовый дисплей

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

Установка зуммера на 5-дюймовый сенсорный дисплей

В таблице ниже представлено назначение контактов (распиновка) 5-дюймового дисплея. Как вы можете видеть из этой таблицы, большинство контактов используется самим же дисплеем для реализации в нем функций сенсорного экрана (реагирующего на прикосновения), но, несмотря на это, свободными остаются контакты 3, 5, 7, 8, 10, 11, 12, 13, 15, 16 и 24, которые мы можем использовать для подключения зуммера (buzzer). В нашем случае мы подключили зуммер к контакту GPIO 3.

Назначение контактов (распиновка) 5-дюймового сенсорного дисплея

Объяснение программы для Raspberry Pi для обнаружения движения на видео

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

Мониторинг нескольких камер на Raspberry Pi с помощью протокола RTSP

Основной задачей при написании этого фрагмента программы является уменьшение нагрузки на Raspberry Pi чтобы предотвратить задержки при трансляции видеопотока (streaming). Изначально автор проекта пытался переключаться между всеми 4 камерами и отслеживать на них движение, но этот процесс происходил с большими задержками (около 10 секунд). Поэтому он объединил видеопотоки со всех 4 камер в одно изображение и производил обнаружение движения на этом объединенном изображении. Для этого он запрограммировал две функции, с названиями create_camera и read_camera.

Функция create_camera используется для открытия камеры с соответствующим номером канала. Заметьте, что в этой функции RTSP URL заканчивается на “02” – это означает что мы использовали трансляцию видео с под-потоков (sub-stream). Видео в этих под-потоках имеет меньшее разрешение чем в основном канале и поэтому быстрее обрабатывается. Также существенное влияние на скорость обработки видео оказывает тип используемого видеокодека. Автор проекта экспериментировал с различными видеокодеками и обнаружил, что наилучшие показатели производительности обеспечивает кодек FFMPEG.

def create_camera (channel):

    rtsp = «rtsp://» + rtsp_username + «:» + rtsp_password + «@» + rtsp_IP + «:554/Streaming/channels/» + channel + «02» #change the IP to suit yours

    cap = cv2.VideoCapture(rtsp, cv2.CAP_FFMPEG)

    cap.set(3, cam_width)  # ID number for width is 3

    cap.set(4, cam_height)  # ID number for height is 480

    cap.set(10, 100)  # ID number for brightness is 10

    return cap

В функции read_camera мы будем считывать видео со всех 4 камер с именами cam1, cam2, cam3 и cam4 и затем объединять их в единое изображение с названием Main_screen. Как только это изображение будет готово, мы можем «запускать» на него OpenCV.

def read_camera ():

    success, current_screen = cam1.read()

    Main_screen [:cam_height, :cam_width, :3] = current_screen

    success, current_screen = cam2.read()

    Main_screen[cam_height:cam_height*2, :cam_width, :3] = current_screen

    success, current_screen = cam3.read()

    Main_screen[:cam_height, cam_width:cam_width*2, :3] = current_screen

    success, current_screen = cam4.read()

    Main_screen[cam_height:cam_height*2, cam_width:cam_width*2, :3] = current_screen

    return (Main_screen)

Внешний вид получившегося у нас подобного объединенного изображения показан на следующем рисунке.

Внешний вид объединенного изображения для нашего проекта

Обнаружение движения с помощью OpenCV и Raspberry Pi

Когда наше объединенное изображение будет готово, мы можем начинать на нем обнаружение движения. Внутри цикла while мы начнем считывание двух различных кадров с именами frame1 и frame2, после чего будем конвертировать их в черно-белое изображение с оттенками серого (grayscale).

frame1 = read_camera() #Read the first frame

grayImage_F1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)  # Convert to gray

frame2 = read_camera() #Read the 2nd frame

grayImage_F2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)

Затем мы будем анализировать различия (с определенной границей (threshold) между этими двумя изображениями чтобы определить что изменилось. Затем мы будем помечать «пятнами» все места, в которых зафиксированы изменения и растягивать изображение чтобы предотвратить появление острых краев.

diffImage = cv2.absdiff(grayImage_F1,grayImage_F2) #get the differance —this is cool

blurImage = cv2.GaussianBlur(diffImage, (5,5), 0)

_, thresholdImage = cv2.threshold(blurImage, 20,255,cv2.THRESH_BINARY)

dilatedImage = cv2.dilate(thresholdImage,kernal,iterations=5)

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

contours, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour is a magic function

for contour in contours: #for every change that is detected

    (x,y,w,h) = cv2.boundingRect(contour) #get the location where change was found

    if cv2.contourArea(contour) > motion_threshold:

        cv2.rectangle(frame1, (x, y), (x + w, y + h), (255, 255, 0), 1)

        display_screen = find_screen()

Функция find_screen() используется для определения того, на какой из 4-х камер зафиксировано движение. Мы можем определить это поскольку знаем координаты x и y, на которых зафиксировано движение. Мы сравниваем эти значения x и y с местоположением экрана каждой из камер (на объединенном изображении) и, таким образом, определяем на каком экране зафиксировано движение. Затем мы вырезаем с объединенного изображения картинку этого экрана и выводим ее на весь экран Raspberry Pi.

def find_screen():

    if (x < cam_width):

        if (y < cam_height):

            screen = frame1[0:cam_height, 0:cam_width]

            print(«Activity in cam screen 1»)

        else:

            screen = frame1[cam_height:cam_height*2, :cam_width]

            print(«Activity in cam screen 2»)

    else:

        if (y < cam_height):

            screen = frame1[:cam_height, cam_width:cam_width*2]

            print(«Activity in cam screen 3»)

        else:

            screen = frame1[cam_height:cam_height*2, cam_width:cam_width*2]

            print(«Activity in cam screen 4»)

    return (screen)

Установка срабатывания сигнала тревоги при обнаружении движения

Поскольку теперь мы знаем на каком экране обнаружено движение, мы можем добавить любой тип сигнала тревоги (alarm) какой нам необходим. В этом проекте мы для этой цели использовали зуммер, подключенный к контакту GPIO 3. Мы проверяем с помощью условия if обнаружено ли движение на 3-м экране – если это так, то мы инкрементируем значение переменной trig_alarm. Вы можете изменить срабатывание этого условия на любой экран или даже на несколько экранов.

         if ((x>cam_width) and (y<cam_height)): #screen 3

                trig_alarm+=1

            else:

                trig_alarm =0              

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

    if (trig_alarm>=3):#wait for conts 3 motions

        #Beep the Buzzer

        GPIO.output(BUZZER,1)

        time.sleep(0.02)

        GPIO.output (BUZZER,0)

        trig_alarm =0

Мониторинг температуры системы

Поскольку предполагается что наша система обнаружения движения в видеопотоке с камер должна работать в режиме 24×7, то вследствие этого плата Raspberry Pi может достаточно сильно нагреваться. Вследствие этого мы решили выводить на экран дисплея температуру платы и интенсивность использования процессора (CPU) платы. Мы будем получать эту информацию с помощью библиотеки gpiozero.

cpu = CPUTemperature()

    load = LoadAverage()

    cpu_temperature = str((cpu.temperature)//1)

    load_average = str(load.load_average)

    #print (cpu.temperature)

    #print(load.load_average)

    cv2.putText(display_screen, cpu_temperature, (250,250), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0,0,255), 1)

    cv2.putText(display_screen, load_average, (300,250), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0,255,0), 2)

Тестирование работы проекта

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

Тестирование работы проекта

Если вы планируете эксплуатировать подобный проект достаточно долгое время, то его автор строго рекомендует использовать правильный корпус для платы и вентилятор охлаждения для ее процессора. Также, если вы собираетесь эксплуатировать данный проект в месте, где случаются перебои с электричеством, то его целесообразно дополнить источником бесперебойного питания (UPS) и автозапуском OpenCV при перезагрузке платы.

Исходный код программы на Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

#!/usr/bin/env python3

import cv2

import numpy as np

import time

import RPi.GPIO as GPIO

from gpiozero import CPUTemperature, LoadAverage

#Enter credentials for CCTV

rtsp_username = «admin»

rtsp_password = «aswinth347653»

rtsp_IP = «192.168.29.100»

cam_width = 352 #set to resolution of incoming video from DVR (установка разрешения видео – ширина)

cam_height = 288 #set to resolution of incoming video from DVR (установка разрешения видео – высота)

motion_threshold = 1000 #decrease this value to increase sensitivity (уменьшите это значение чтобы увеличить чувствительность)

cam_no = 1

trig_alarm =0

GPIO.setmode(GPIO.BCM)

GPIO.setwarnings (False)

BUZZER = 3

GPIO.setup(BUZZER,GPIO.OUT)

def create_camera (channel):

    rtsp = «rtsp://» + rtsp_username + «:» + rtsp_password + «@» + rtsp_IP + «:554/Streaming/channels/» + channel + «02» #change the IP to suit yours (измените IP на свой)

    cap = cv2.VideoCapture(rtsp, cv2.CAP_FFMPEG)

    cap.set(3, cam_width)  # ID number for width is 3 (установка ширины)

    cap.set(4, cam_height)  # ID number for height is 4 (установка высоты)

    cap.set(10, 100)  # ID number for brightness is 10 (установка яркости)

    return cap

def read_camera ():

    success, current_screen = cam1.read()

    Main_screen [:cam_height, :cam_width, :3] = current_screen

    success, current_screen = cam2.read()

    Main_screen[cam_height:cam_height*2, :cam_width, :3] = current_screen

    success, current_screen = cam3.read()

    Main_screen[:cam_height, cam_width:cam_width*2, :3] = current_screen

    success, current_screen = cam4.read()

    Main_screen[cam_height:cam_height*2, cam_width:cam_width*2, :3] = current_screen

    return (Main_screen)

def find_screen():

    if (x < cam_width):  

        if (y < cam_height):

            screen = frame1[0:cam_height, 0:cam_width]

            print(«Activity in cam screen 1»)

        else:

            screen = frame1[cam_height:cam_height*2, :cam_width]

            print(«Activity in cam screen 2»)

    else:

        if (y < cam_height):

            screen = frame1[:cam_height, cam_width:cam_width*2]

            print(«Activity in cam screen 3»)

        else:

            screen = frame1[cam_height:cam_height*2, cam_width:cam_width*2]

            print(«Activity in cam screen 4»)

    return (screen)

#Open all four camera Framers (открываем все 4 камеры)

cam1 = create_camera(str(1))

cam2 = create_camera(str(2))

cam3 = create_camera(str(3))

cam4 = create_camera(str(4))

print («Reading camera successfull»)

Main_screen = np.zeros(( (cam_height*2), (cam_width*2), 3) , np.uint8) # создаем экран, на котором будут объединены изображения со всех 4-х камер

display_screen = np.zeros(( (cam_height*2), (cam_width*2), 3) , np.uint8) # изменяем размеры экрана чтобы отображать его на 5-дюймовом TFT дисплее

kernal = np.ones((5,5),np.uint8) #form a 5×5 matrix with all ones range is 8-bit

while True:

    frame1 = read_camera() # считываем первый кадр

    grayImage_F1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)  # конвертируем его в серое изображение

    frame2 = read_camera() # считываем второй кадр

    grayImage_F2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)

    diffImage = cv2.absdiff(grayImage_F1,grayImage_F2) #определяем разницу между двумя кадрами

    blurImage = cv2.GaussianBlur(diffImage, (5,5), 0)

    _, thresholdImage = cv2.threshold(blurImage, 20,255,cv2.THRESH_BINARY)

    dilatedImage = cv2.dilate(thresholdImage,kernal,iterations=5)

    contours, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour is a magic function

    for contour in contours: #for every change that is detected

        (x,y,w,h) = cv2.boundingRect(contour) # находим местоположение где зафиксировано изменение

        if cv2.contourArea(contour) > motion_threshold:

            cv2.rectangle(frame1, (x, y), (x + w, y + h), (255, 0, 0), 1)

            display_screen = find_screen()

            if ((x>cam_width) and (y<cam_height)): #screen 3

                trig_alarm+=1

            else:

                trig_alarm =0            

    if (trig_alarm>=3):#wait for conts 3 motions (если движение фиксируется в 3-х или более кадрах)

        #Beep the Buzzer (включаем зуммер)

        GPIO.output(BUZZER,1)

        time.sleep(0.02)

        GPIO.output (BUZZER,0)

        trig_alarm =0

    cpu = CPUTemperature()

    load = LoadAverage()

    cpu_temperature = str((cpu.temperature)//1)

    load_average = str(load.load_average)

    #print (cpu.temperature)

    #print(load.load_average)

    cv2.putText(display_screen, cpu_temperature, (250,250), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0,0,255), 1)

    cv2.putText(display_screen, load_average, (300,250), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0,255,0), 2)

    print(trig_alarm)

    dim = (800, 480)

    Full_frame = cv2.resize (display_screen,dim,interpolation=cv2.INTER_AREA)

    cv2.namedWindow(«AISHA», cv2.WINDOW_NORMAL)

    cv2.setWindowProperty(‘AISHA’, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)

    cv2.imshow(«AISHA»,Full_frame)

    if cv2.waitKey(1) & 0xFF == ord(‘p’):

        cam1.release()

        cam2.release()

        cam3.release()

        cam4.release()

        cv2.destroyAllWindows()

        break

Видео, демонстрирующее работу проекта

Источник статьи

Загрузка…

1 409 просмотров

Понравилась статья? Поделить с друзьями:
  • Одинаковая нумерация страниц в ворде как исправить
  • 0x80070490 windows 10 как исправить принтер
  • Как найти человека в днепре
  • Как можно найти видеомонтажа
  • Как найти картинки на заставку телефона