混合高斯模型进行背景建模
项目理论和源码来自唐宇迪opencv项目实战
https://blog.csdn.net/qq_42152399/article/details/80383967
混合高斯模型的原理
用混合高斯背景建模提取出基于二值化图像中的运动目标。对于输入的一段视频文件,无论是提取视频中行人的运动情况还是车的运动情况,某一帧图像以某一像素点为中心和其相邻像素点呈现高斯分布。
如果像素点的值偏离中心值较远,那么,这个像素值属于前景,如果像素点的值偏离中心值很近(在一定方差范围内),那么可以说这个点属于背景。理论上,如果不存在任何干扰的话,是可以准确区分前景和背景的。
简单来说,
创建第一个高斯模型:对于输入的视频文件假设一共有T帧数据,用第一帧第一个像素点对第一个高斯模型的期望值μ1进行初始化,σ1用默认值来初始化。
下一帧图片对应相同位置的像素点为μ2,与μ1的差值和3×σ1的数值比较。如果差距较小,则把第二帧与第一帧图片在同一像素点上的分布视为相同的高斯分布。并且更新当前分布的μ和σ值。如果传入心得一帧图片μ2与μ1相差较大,则说明新传入的帧与上一真图片在该像素点位置属于不同的分布,则利用新传入的一帧再建立一个新的分布,用新传入一帧来初始化新的分布的μ和σ值。
对于一个T帧的视频流数据,通常设置3-5个不同的高斯分布。
创建高斯混合模型的过程可以看作是一个不断学习的过程。对于一个已经完成学习的模型,在测试过程中,输入一张图片某一像素点和该像素点已经建立好的模型进行对比,有较大差异,说明该像素点为前景图像。则说明该像素点属于我们要识别的运动的物体。将前景像素点用255来赋值,背景像素点用0来赋值。
理论上,如果不存在任何干扰的话,是可以准确区分前景和背景的。
但实际情况下,视频会受到很多因素影响,光线亮或暗,摄像头可能出现抖动,画面中可能存在摆动的物体。在混合高斯模型中这些因素会造成干扰。
混合高斯模型适合处理缓慢运动的物体,而频繁变化的物体像素点可能会被视为噪声。
生成高斯模型的代码:
cv2.createBackgroundSubtractorMOG2()
背景建模的代码如下:
import numpy as np
import cv2
cap = cv2.VideoCapture('test.avi')
# cap = cv2.VideoCapture(0)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
fgbg = cv2.createBackground