目标识别与追踪 计算机视觉项目实战-背景建模与光流估计( 二 )


取视频中T帧数据图像用来训练高斯混合模型 。来了第一个像素之后用它来当做第一个高斯分布 。
我们取得不是一帧图像,而是多帧,一般我们取值在200帧左右,第一帧的第一个像素点取完之后呢,然后我们取第二帧的第一个像素点,得到像素值是105,然后计算一下105-100=5
当后面来的像素值时,与前面已有的高斯的均值比较,如果该像素点的值与其模型均值差在3倍的方差内,则属于该分布,并对其进行参数更新 。
如果下一次来的像素不满足当前高斯分布,用它来创建一个新的高斯分布 。
当第三帧图像来的时候,像素值假如是180,那么180-105=75>3*5,那么我们这个时候就要创建一个分布 。
一般来说,我们创建的分布设定在3-5个就OK!
对于混合高斯模型来说,他有一个学习更新的过程 。所以他要比帧差法要强很多 。
在测试阶段,对于新来的像素点的数值,混合高斯模型中的每一个均值比较,如果差值在二倍的方差之间的话就可以认为他是一个背景,否则认为是前景 。将前景赋值为255,背景赋值为0 。这样就形成了一副前景二值图 。
??混合高斯模型背景建模实战

目标识别与追踪  计算机视觉项目实战-背景建模与光流估计

文章插图
首先我们来看了一下官方标准案例 。他是做了一个摄像头下的人物走动的视频,然后使用混合高斯模型进行背景建模 。我们来看一下代码 。
这里导入第三方库 。
import numpy as npimport cv2
然后将视频导入,建立一个卷积核,并且创建混合高斯模型用于背景建模 。
cap = cv2.VideoCapture('test.avi')#形态学操作需要使用kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))#创建混合高斯模型用于背景建模fgbg = cv2.createBackgroundSubtractorMOG2()
cv2.t这个函数的第一个参数表示内核的形状 。共有三种 。
矩形:;交叉形:;椭圆形:;
mog = cv2.(,,false);这个函数来说 。
:用于训练背景的帧数,默认帧数为500帧,如果不动手设置,就被用于计算当前的, 此时越大,越小,背景更新越慢;:方差阈值,用于判断当前像素是前景还是背景 。一般默认为16,如果光照变化明显,如阳光下的水面,建议设为25,值越大灵敏度越低 。:是否检测影子,设为true为检测,false为不检测,检测影子会增加程序时间复杂度,一般设置为false;
然后mog->apply(, , 0.005);
image 源图fmask 前景(二值图像) 学习速率,值为0-1,为0时背景不更新,为1时逐帧更新,默认为-1,即算法自动更新;
然后进入循环
while(True):ret, frame = cap.read()fgmask = fgbg.apply(frame)#形态学开运算去噪点fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)#寻找视频中的轮廓contours, hierarchy = cv2.findContours(fgmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
首先我们先来ret, frame = cap.read()用于摄像头或视频文件中,捕获帧信息 。返回的两个值分别是:
然后利用cv2.(, cv2., 开运算 。
在进行膨胀操作的时候我们介绍到了这个:
1.图像被腐蚀后,去除了噪声,但是会压缩图像 。
2.对腐蚀过的图像,进行膨胀处理,可以去除噪声,并保持原有形状 。
*开运算(image)=膨胀(腐蚀(image))*
开运算就是先把图像进行腐蚀操作,然后进行膨胀操作的一个过程!
如果我们对于有噪声的图像单独的进行腐蚀操作,就会对图像进行压缩,如果我们想要恢复到原始图像就要进行相同程度上的膨胀,这个操作我们就成为开运算 。