相比与基本背景差分器,MOG能够不断更新背景图像,从而能够更好地应对摄像头的运动以及光线变化带来的影响。
简而言之,原来的算法太过死板,从头到尾都是用的同一个背景图像用于对比,而MOG会随时间变化,更新用于对比的背景(见下面两张图),实际效果更好。
# MOG背景差分器
# MOG背景差分器中取消了高斯模糊的操作
import cv2
# 定义运算的核算子
erode_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
dilate_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))
# 打开摄像头
cap = cv2.VideoCapture(0)
success, frame = cap.read()
# 丢弃9帧,让相机有足够时间调整
for i in range(9):
success, frame = cap.read()
if not success:
exit(1)
# detectShadows设置为true,就会标记出阴影区域,避免实际生活中瓷砖的倒影阴影的影响
# 前景部分会用白色255标记,阴影部分用灰色127标记,背景用黑色标记
mog_subtract = cv2.createBackgroundSubtractorMOG2(detectShadows=True)
success, frame = cap.read()