背景减除(Background Subtraction)是一种用于从视频序列中提取前景对象的计算机视觉技术。该技术的主要思想是通过建模和维护场景的背景,从而检测出在不同时间点出现的前景对象。
OpenCV 提供了一些用于背景减除的函数,其中最常用的是 cv2.createBackgroundSubtractorMOG2
。 cv2.createBackgroundSubtractorMOG2
是 OpenCV 中用于创建混合高斯模型的背景减除器的函数。这个函数用于从视频中提取前景对象,通过对每个像素的灰度值进行建模,以便检测变化的部分。
下面是 cv2.createBackgroundSubtractorMOG2
函数的基本用法:
cv2.createBackgroundSubtractorMOG2(history=500, varThreshold=16, detectShadows=True)
参数说明:
history
: 用于建模背景的历史帧数。默认是 500。varThreshold
: 方差阈值,用于判定像素是否属于前景。默认是 16。detectShadows
: 是否检测阴影。如果为 True,则会检测阴影并将其标记为灰色。默认是 True。
以下是一个简单的示例,演示如何使用 cv2.createBackgroundSubtractorMOG2
进行背景减除:
import cv2# 创建背景减除器
bg_subtractor = cv2.createBackgroundSubtractorMOG2()# 打开摄像头
cap = cv2.VideoCapture(0)while True:# 读取当前帧ret, frame = cap.read()# 应用背景减除器,获取前景掩码fg_mask = bg_subtractor.apply(frame)# 可选:对前景掩码进行形态学操作,去除噪音kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))fg_mask = cv2.morphologyEx(fg_mask, cv2.MORPH_OPEN, kernel)# 在原始帧上绘制前景对象result = cv2.bitwise_and(frame, frame, mask=fg_mask)# 显示原始帧和结果cv2.imshow('Original Frame', frame)cv2.imshow('Foreground Objects', result)# 按下 ESC 键退出循环if cv2.waitKey(30) & 0xFF == 27:break# 释放摄像头和关闭窗口
cap.release()
cv2.destroyAllWindows()
在这个示例中,我们使用了摄像头捕捉每一帧,并通过 cv2.createBackgroundSubtractorMOG2
创建了一个背景减除器。然后,通过 bg_subtractor.apply
函数获取前景掩码,可选地使用形态学操作进行噪音去除,并在原始帧上绘制前景对象。最后,我们通过 OpenCV 显示原始帧和结果。按下 ESC 键可以退出循环。
请注意,你可以调整背景减除器的参数,例如设置阈值、学习速率等,以满足特定场景的需求。