Меню

Python opencv датчик движения

Распознавание движения в Python OpenCV

В одной из прошлых статей по OpenCV мы узнали как выводить контуры изображения из видео потока и нормализовать их т.е. избавиться от лишних контуров. В этой статье мы познакомимся с концепцией вычитания кадров, т.е. нахождение разницы между двумя кадрами видео потока, а также познакомимся с некоторыми новыми методами библиотеки Opencv: absdiff(), threshold(), dilate(), findContours(), boundingRect(), contourArea().

Запустив данный скрипт, вы увидите как он распознает движение на видеопотоке, окружая движущийся объект зеленым контуром.

import cv2 # импорт модуля cv2

#cv2.VideoCapture(«видеофайл.mp4»); вывод кадров из видео файла
cap = cv2.VideoCapture(0); # видео поток с веб камеры

cap.set(3,1280) # установка размера окна
cap.set(4,700)

ret, frame1 = cap.read()
ret, frame2 = cap.read()

while cap.isOpened(): # метод isOpened() выводит статус видеопотока

diff = cv2.absdiff(frame1, frame2) # нахождение разницы двух кадров, которая проявляется лишь при изменении одного из них, т.е. с этого момента наша программа реагирует на любое движение.

gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY) # перевод кадров в черно-белую градацию

blur = cv2.GaussianBlur(gray, (5, 5), 0) # фильтрация лишних контуров

_, thresh = cv2.threshold(blur, 20, 255, cv2.THRESH_BINARY) # метод для выделения кромки объекта белым цветом

dilated = cv2.dilate(thresh, None, iterations = 3) # данный метод противоположен методу erosion(), т.е. эрозии объекта, и расширяет выделенную на предыдущем этапе область

сontours, _ = cv2.findContours(dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # нахождение массива контурных точек

for contour in сontours:
(x, y, w, h) = cv2.boundingRect(contour) # преобразование массива из предыдущего этапа в кортеж из четырех координат

# метод contourArea() по заданным contour точкам, здесь кортежу, вычисляет площадь зафиксированного объекта в каждый момент времени, это можно проверить
print(cv2.contourArea(contour))

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 0 ):

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2021 Русаков Михаил Юрьевич. Все права защищены.

    Источник

    Распознавание лиц и движения с помощью компьютерного зрения

    Opencv (Open Source Computer Vision Library или библиотека компьютерного зрения с открытым исходным кодом) – это модуль Python, используемый для решения задач с помощью компьютерного зрения. Это огромный модуль с исключительными возможностями. Используя компьютерное зрение, мы можем решать самые разные задачи. Примером таких задач может быть распознавание лиц и движения.

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

    Чтобы избежать всевозможных ошибок и проблем, мы загрузили файл opencv с GitHub по адресу https://github.com/opencv/opencv. Мы будем использовать некоторые содержащиеся в нем файлы для завершения кода.

    Распознавание лиц на изображениях

    В файле GitHub OpenCV есть подкаталог (opencv-master\samples\data) с именем data , в котором доступны образцы изображений и видео для работы. Мы будем использовать фотографии и видео из этого каталога. В частности, давайте возьмем файл lena.jpg . Скопируем и вставим его в свой рабочий каталог в PyCharm (или в любом другом редакторе). Теперь приступим к распознаванию лиц на этом изображении.

    Для начала загрузим необходимые нам модули:

    Файл, который мы будем использовать, находится по адресу opencv-master\data\haarcascades\haarcascade_frontalface_default.xml в файле, загруженном с GitHub. Разместим ссылку на файл haarcascade следующим образом:

    Загрузим фотографию, чтобы выполнить распознавание лица с помощью метода imread() библиотеки cv2.

    Наша следующая цель – превратить фотографию в оттенки серого. Сделаем это с помощью метода cv2.cvtColor() .

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

    Затем воспользуемся функцией detectMultiScale() для обнаружения объектов (в нашем случае — лиц). Здесь мы напишем face_cascade.detectMultiScale() , который будет обнаруживать лица (это указано параметром face_cascade ).

    Читайте также:  Датчик температуры за бортом поло седан

    Функция detectMultiScale() принимает несколько аргументов: изображение, коэффициент масштабирования, минимальное количество соседей, флаги, минимальный и максимальный размер. Мы укажем только первые 3 аргумента.

    Чтобы разместить прямоугольную рамку вокруг лица, нам нужно использовать метод cv2.rectangle() . Он принимает несколько аргументов. Первый – это наше изображение, второй – начальная точка прямоугольника, третий – конечная точка прямоугольника, четвертый – цвет прямоугольника, а пятый – его толщина. В данном случае w – ширина, h – высота, x и y – координаты начальной точки.

    Наконец, мы выводим изображение на экран с помощью метода cv2.imshow() . Мы также используем cv2.waitKey(0) , чтобы установить бесконечное время ожидания, и cv2.destroyAllWindows() , чтобы закрыть окно.

    Распознавание лиц с помощью видео или веб-камеры

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

    Далее нам нужно указать расположение файлов haarcascade . Делаем это следующим образом:

    Теперь нам нужно указать видео, с которым мы будем работать. Для этого воспользуемся методом cv2.VideoCapture() . Сейчас мы будем использовать уже готовое видео. Если вам нужно работать с веб-камерой, поставьте 0 вместо имени видеофайла.

    Далее мы запускаем бесконечный цикл: мы просим программу определять лица, пока мы сами не остановим её. Видеофайл читаем с помощью функции read() .

    Как и в предыдущем примере, для облегчения обнаружения лиц нам нужно преобразовать изображения или кадры в оттенки серого. Чтобы изменить цвет фреймов на серый, мы используем метод cv2.cvtColor() .

    Воспользуемся функцией detectMultiScale() для обнаружения лиц. Функция принимает те же параметры, что и в предыдущем примере.

    Чтобы разместить прямоугольники вокруг граней, мы используем метод cv2.rectangle() . Это мы уже тоже делали 😃

    Затем мы показываем кадры с помощью метода cv2.imshow() . Этот метод принимает два аргумента: первый – имя фрейма, а второй – фрейм для отображения.

    Затем мы прописываем что, если пользователь нажимает клавишу ESC (или 27), тогда цикл завершится, и программа остановится.

    И наконец, мы выпускаем видео с помощью функции release() .

    Распознавание движения

    А теперь давайте попробуем с помощью Python и хорошей веб-камеры создать нашу собственную камеру безопасности! Итак, приступим. Для начала импортируем библиотеки (те же, что и в прошлых примерах).

    Возьмем видео из примеров (opencv-master\samples\data) файла с GitHub.

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

    Пока открыто видео или используется функция isOpened() , мы начинаем цикл.

    Основная часть программы

    Для начала давайте вычислим абсолютную разницу между frame1 и frame2 с помощью метода cv2.absdiff() .

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

    Когда изображение преобразовано в оттенки серого, нам нужно его размыть, чтобы удалить шум. Для этого используется метод cv2.GaussianBlur() . Он принимает несколько аргументов: исходное изображение для размытия, выходное изображение, размер ядра Гаусса, стандартное отклонение ядра по оси x, стандартное отклонение ядра по оси y и тип границы.

    Затем мы устанавливаем пороговое значение с помощью метода cv2.threshold() . Эта техника изолирует движение, сегментируя фон и передний план (или движение). Метод cv2.threshold() принимает четыре аргумента: изображение, пороговое значение, максимальное значение, используемое с THRESH_BINARY и THRESH_BINARY_INV , и тип порогового значения.

    Затем мы используем метод cv2.dilate() , который принимает максимум 6 аргументов: изображение, ядро, привязку, итерации, тип границы и значение границы.

    Метод cv2.findContours() находит контуры, что логично следует из названия. Он принимает три аргумента: исходное изображение, режим поиска и метод аппроксимации контура.

    Метод cv2.drawContours() используется для рисования контуров. Он также принимает несколько аргументов: изображение, контуры, contourIdx (это значение отрицательно, если нарисованы все контуры), цвет, толщина, тип линии, иерархия, максимальный уровень и смещение.

    Наконец, мы показываем изображение с помощью метода cv2.imshow() .

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

    Если клавиша «q» нажата, произойдет выход из цикла:

    В целом код для обнаружения движения будет выглядеть примерно так:

    Просто, не правда ли? Несколько строк кода, и мы можем создавать собственные программы распознавания лиц и движения. Несколько дополнительных строк, и мы даже можем заставить их говорить (скажем, используя pttsx3) и в итоге создать собственные камеры безопасности!

    Читайте также:  Датчик давления std924 руководство по эксплуатации

    Источник

    Русские Блоги

    Opencv: реализация Python для обнаружения движения, основанная на удалении фона и извлечении Rol на переднем плане

    Opencv: реализация Python для обнаружения движения, основанная на устранении фона и извлечении переднего плана

    1. Содержание

    Фон / Извлечение переднего плана
    Одним из наиболее часто используемых методов анализа видео сцены является передачаУстранение фонаЧтобы извлечь движущиеся объекты переднего плана и получить изображение маски переднего плана, наиболее часто используемый метод удаления фонаВычитание разности кадровИспользуйте предыдущий кадр в качестве фонового изображения и вычтите его из текущего кадра, но этот метод очень чувствителен к влиянию освещения и шума. Все хорошие методы — вычесть фоновую модель из предыдущей серии кадров, что достигается в OpenCV Существует два алгоритма извлечения фоновой модели, один из которых основан наГауссовская модель смеси GMMДостигнуто фоновое извлечение, другое основано наБлижайший сосед КННДостигнуто. Для разработчиков существуют соответствующие API-интерфейсы. Связанный API
    createBackgroundSubtractorMOG2(
    int history = 500,
    double varThreshold = 16,
    bool detectShadows = true
    )
    Параметры объясняются следующим образом:
    historyПредставляет количество прошедших кадров, 500 кадров, выбор истории = 1 станет разницей в два кадра
    varThresholdПредставляет расстояние Махаланобиса между пикселем и моделью. Чем больше значение, только самые последние пиксели будут классифицированы на переднем плане. Чем меньше значение, тем более чувствителен передний план к свету.
    detectShadows Независимо от того, чтобы сохранить обнаружение теней, выберите False как можно быстрее.

    Удаление фона и извлечение ROI на переднем плане

    Модель через фон в видео для достиженияУстранение фонаГенерация изображений маски и извлечение области ROI активных объектов переднего плана путем анализа двоичного изображения маски. Это один из методов, обычно используемых во многих программах анализа видеонаблюдения. Этот метод работает в режиме реального времени! Все шаги следующие:
    1. Инициализировать фоновое моделирование объекта GMM
    2. Прочитайте один кадр видео
    3. Используйте фоновое моделирование для устранения сгенерированной маски
    4. Контурный анализ маски для извлечения ROI
    5. окрашенныйROI объект

    Источник

    Делаем детектор движения, или 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 утра, поэтому приму сообщения об ошибках. Но — в личку.

    Источник

    Adblock
    detector