Вычитание фона в изображении с использованием концепции скользящего среднего

Опубликовано: 9 Июля, 2021

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

В этой статье мы обсудим концепцию скользящего среднего . Среднее значение функции используется для отделения переднего плана от фона. В этой концепции видеопоследовательность анализируется по определенному набору кадров. Во время этой последовательности кадров вычисляется скользящее среднее по текущему кадру и предыдущим кадрам. Это дает нам модель фона, и любой новый объект, представленный во время последовательности видео, становится частью переднего плана. Затем в текущем кадре находится вновь представленный объект с фоном. Затем выполняется вычисление абсолютной разницы между моделью фона (которая является функцией времени) и текущим кадром (который представляет собой недавно введенный объект). Текущее среднее значение рассчитывается с использованием уравнения, приведенного ниже:

                    

Предпосылки:

  • Работающая веб-камера или модуль камеры для ввода.
  • Загрузите версию Python 3.x, Numpy и OpenCV 2.7.x. Проверьте, совместима ли ваша ОС с 32-битной или 64-битной, и установите ее соответствующим образом.
  • Проверьте текущий статус numpy и OpenCV

Как работает метод скользящего среднего?

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


cv2.accumulateWeighted (src, dst, alpha)

В эту функцию передаются следующие параметры:

  1. src : исходное изображение. Изображение может быть цветным или полутоновым, а также 8-битным или 32-битным изображением с плавающей запятой.
  2. dst : аккумулятор или целевой образ. Это либо 32-битная, либо 64-битная числа с плавающей запятой.
    ПРИМЕЧАНИЕ. У него должны быть те же каналы, что и у исходного изображения. Кроме того, значение dst должно быть заранее объявлено заранее.
  3. альфа : вес входного изображения. Альфа определяет скорость обновления. Если вы установите более низкое значение для этой переменной, скользящее среднее будет выполняться по большему количеству предыдущих кадров и наоборот.

Код:




# Python program to illustrate
# Background subtraction using
# concept of Running Averages
# organize imports
import cv2
import numpy as np
# capture frames from a camera
cap = cv2.VideoCapture( 0 )
# read the frames from the camera
_, img = cap.read()
# modify the data type
# setting to 32-bit floating point
averageValue1 = np.float32(img)
# loop runs if capturing has been initialized.
while ( 1 ):
# reads frames from a camera
_, img = cap.read()
# using the cv2.accumulateWeighted() function
# that updates the running average
cv2.accumulateWeighted(img, averageValue1, 0.02 )
# converting the matrix elements to absolute values
# and converting the result to 8-bit.
resultingFrames1 = cv2.convertScaleAbs(averageValue1)
# Show two output windows
# the input / original frames window
cv2.imshow( 'InputWindow' , img)
# the window showing output of alpha value 0.02
cv2.imshow( 'averageValue1' , resultingFrames1)
# Wait for Esc key to stop the program
k = cv2.waitKey( 30 ) & 0xff
if k = = 27 :
break
# Close the window
cap.release()
# De-allocate any associated memory usage
cv2.destroyAllWindows()

Выход :

Как мы ясно видим ниже, рука блокирует фоновое изображение.

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

Текущее среднее значение четко показывает фон ниже, скользящее среднее с альфа 0,02 уловило его как прозрачную стрелку, с основным акцентом на фоне.

В качестве альтернативы мы можем использовать cv.RunningAvg () для той же задачи с параметрами, имеющими то же значение, что и параметры cv2.accumulateweighted ().


cv.RunningAvg (изображение, соответствие, альфа)

Ссылки :

  1. https://docs.opencv.org/2.4/modules/imgproc/doc/motion_analysis_and_object_tracking.html
  2. https://en.wikipedia.org/wiki/Foreground_detection
  3. https://docs.opencv.org/3.2.0/d1/dc5/tutorial_background_subtraction.html

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.