Вычитание фона – это фундаментальный метод компьютерного зрения, используемый для отделения объектов переднего плана от фона в видео или последовательности изображений. Он находит применение в различных областях, таких как наблюдение, отслеживание объектов и анализ видео. В этой статье мы рассмотрим несколько методов вычитания фона, доступных в OpenCV и реализованных с использованием Python. Мы предоставим примеры кода для каждого метода, чтобы помочь вам понять их реализацию.
- Простое вычитание фона.
Самый простой подход предполагает вычитание статического фонового изображения из каждого кадра видео. Полученное разностное изображение выделяет объекты переднего плана. Вот пример фрагмента кода:
import cv2
cap = cv2.VideoCapture('video.mp4')
background = cv2.imread('background.jpg')
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
diff = cv2.absdiff(frame, background)
cv2.imshow('Foreground', diff)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
- Вычитание фона по скользящему среднему.
Этот метод поддерживает скользящее среднее значение фона с течением времени, адаптируясь к постепенным изменениям сцены. Вот пример фрагмента кода:
import cv2
cap = cv2.VideoCapture('video.mp4')
alpha = 0.01
background = None
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
if background is None:
background = frame.copy().astype('float')
continue
cv2.accumulateWeighted(frame, background, alpha)
diff = cv2.absdiff(frame, cv2.convertScaleAbs(background))
cv2.imshow('Foreground', diff)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
- Вычитание фона модели гауссовой смеси (GMM):
Этот метод моделирует интенсивность каждого пикселя как смесь гауссовых распределений, что позволяет более надежно оценить фон. Вот пример фрагмента кода:
import cv2
cap = cv2.VideoCapture('video.mp4')
bg_subtractor = cv2.createBackgroundSubtractorMOG2()
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
fg_mask = bg_subtractor.apply(frame)
cv2.imshow('Foreground', fg_mask)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
- Вычитание фона K-ближайших соседей (KNN):
Этот метод использует алгоритм k-ближайших соседей для классификации каждого пикселя как фона или переднего плана. Вот пример фрагмента кода:
import cv2
cap = cv2.VideoCapture('video.mp4')
bg_subtractor = cv2.createBackgroundSubtractorKNN()
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
fg_mask = bg_subtractor.apply(frame)
cv2.imshow('Foreground', fg_mask)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
В этой статье мы рассмотрели несколько методов вычитания фона, доступных в OpenCV с использованием Python. Мы предоставили примеры кода для каждого метода, что позволяет вам реализовать их и поэкспериментировать с ними в ваших собственных проектах. Вычитание фона — мощный инструмент компьютерного зрения, позволяющий использовать различные приложения, такие как обнаружение и отслеживание объектов. Понимая эти методы, вы сможете извлекать значимую информацию о переднем плане из видео или последовательностей изображений.