Обнаружение движущихся объектов с помощью компьютерного зрения и библиотеки OpenCV

Автор: Ледяев В.П.

Журнал: Экономика и социум @ekonomika-socium

Статья в выпуске: 12 (43), 2017 года.

Бесплатный доступ

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

Компьютерное зрение, алгоритм вычитания заднего плана

Короткий адрес: https://sciup.org/140235326

IDR: 140235326

Текст научной статьи Обнаружение движущихся объектов с помощью компьютерного зрения и библиотеки OpenCV

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

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

Для этого будет использован язык программирования Python и библиотека OpenCV с достаточно простой идеей определения движения с помощью алгоритма вычитания заднего плана (background subtraction).

Работа состоит из нескольких этапов:

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

  • 2.    Рассмотрения алгоритмов библиотеки OpenCV

  • 3.    Рассмотрение фильтров изображений бибилиотеки OpenCV

Алгоритмы вычитания заднего плана

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

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

Для примера можно рассмотреть видео с камеры наблюдения жилой комнаты. В момент, когда в комнате никого нет, изображение на видео не меняется от кадра к кадру, оно статично. Назовем такое изображение задний план или background_layer. Таким образом для того, чтобы получить объекты, которые двигаются на изображении (foreground_objects) нужно взять разницу текущего кадра (сurrent_frame) и заднего плана:

foreground_objects = current_frame – background_layer

На картинке можно увидеть принцип работы данных алгоритмов.

currentframe

THRESHOLD

T

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

Алгоритмы библиотеки OpenCV

Для решения данной задачи в библиотеке OpenCV было реализовано три алгоритма.

BackgroundSubtractorMOG – это реализация алгоритма представления модели фона смесью Гауссовых распределений. Используется метод для моделирования каждого фонового пикселя смесью K гауссовых распределений (K= 3-5). Веса смесей представляют временные пропорции, в течении которых их цвета оставались неизменными. Вероятные цвета фона – те цвета, которые более продолжительны по времени и более статичны.

BackgroundSubtractorMOG2 – улучшение предыдущего алгоритма. Одна важная особенность этого алгоритма в том, что он выбирает подходящее число Гауссовых распределений на каждый пиксель. Это предоставляет лучшую адаптацию к изменениям освещения. Также в данной реализации есть возможность определения и отделения теней на изображениях.

BackgroundSubtractorGMG – данный алгоритм сочетает статистическую оценку фона изображения с попиксельной Байесовской сегментацией

Результат работы данных алгоритмов представлен ниже.

Оригинал:

BackgroundSubtractorMOG:

BackgroundSubtractorMOG2:

BackgroundSubtractorGMG:

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

BackgroundSubtractorMOG2:

BackgroundSubtractorGMG:

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

BackgroundSubtractorGMG:

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

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

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

Фильтры изображений OpenCV

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

Фильтр closing полезен при закрытии небольших отверстий внутри объектов переднего плана или небольших черных точек на объекте:

Фильтр opening используется для уменьшения шума рядом с объектом:

Фильтр dilation используется для увеличения объектов, что способствует объединению разорванных частей объекта:

Функция, используемая для фильтрации:

def filter_mask(self, img, a=None):

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))

  • #    Заполняем маленькие промежутки

closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

  • #    Убираем шум

opening = cv2.morphologyEx(closing, cv2.MORPH_OPEN, kernel)

  • #    Объединяем объекты

return dilation

Результат:

Заключение

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

Список литературы Обнаружение движущихся объектов с помощью компьютерного зрения и библиотеки OpenCV

  • https://en.wikipedia.org/wiki/Background_subtraction
  • https://docs.opencv.org/3.2.0/d1/dc5/tutorial_background_subtraction.html
  • https://medium.com/machine-learning-world/tutorial-making-road-traffic-counting-app-based-on-computer-vision-and-opencv-166937911660
  • https://www.pyimagesearch.com/2015/11/09/pedestrian-detection-opencv/
Статья научная