一 课题内容
对于固定摄像机镜头的视频(即背景静止),检测出视频中的运动物体,并用方框框出检测到的目标。使用matlab,采取混合高斯背景建模的方法,将avi格式视频文件中的运动物体与背景分离,并标注出运动目标。
二 算法分析
混合高斯背景建模是基于样本统计信息的背景表示方法,利用像素在较长时间内大量样本值的概率密度等统计信息(如模式数量、每个模式的均值和标准差)表示背景,然后使用统计差分进行目标像素判断。它能够对复杂动态背景进行建模,计算量较大。
在混合高斯背景模型中,认为像素之间的颜色信息互不相关,对各像素点的处理都是相互独立的。对于视频图像中的每一个像素点,其值在序列图像中的变化可看作是不断产生像素值的随机过程,即用高斯分布来描述每个像素点的颜色呈现规律。
在进行视频运动目标检测时,只对灰度信息进行建模。
详细的算法流程如下。
(1) 混合高斯模型预定义
首先初始化k个高斯分布,即对高斯模型中的均值和方差参数进行初始化,把视频序列中各帧图像看成是一个时间序列:{X1,X2,…XT}。用k个高斯分布来表征每一帧图像中各像素点特征。则在t时刻,像素点 的概率密度可使用k个高斯密度函数加权来拟合:
为高斯概率密度函数。其中, 、 和为图像序列 在t时刻第i个高斯分布的权重、均值和协方差矩阵。 ,为方差。k一般取值为3~5,在本文中k=3。
(2) 混合高斯模型的参数更新
当前像素与k个高斯分布按逐一进行匹配,根据匹配结果调整高斯模型的参数:
只要当前像素与k个模型其中的一个模型匹配,则认为该像素匹配高斯背景模型。而每个高斯模型的权值更新方法如下:
其中为学习率,若匹配成功,则,否则。即增大匹配的高斯模型的权重。匹配不成功的高斯模型分布参数不变,对匹配成功的高斯模型的均值和方差参数需要进行更新:
其中是更新速率。
若k个高斯模型中没有一个高斯模型与之匹配,则以该像素建立一个新高斯模型,初始化参数,代替原有模型中最不可能的权重最小的单个模型。
当更新完成后,每个高斯模型的权值需要归一化:
(3) 背景模型的选择和前景提取
更新会后,按照对k个高斯分布从高进低进行排序,选择前面B个高斯分布来表征背景图像:
T一般取0.75(本文采用0.25),表征背景图像。
整个混合高斯背景建模的流程如下图所示:
三 具体实现
1. 视频文件的读取
首先读取matlab提供的avi视频文件,比较适合做运动物体检测的有visiontraffic.aviatrium.avi singleball.avi。使用VideoReader函数读取视频对象,获取视频的基本信息,如宽度、高度、帧数。初始化用来存储前景图和背景图的图像fg和bg_bw。
source=VideoReader('singleball.avi'); numFrames=source.NumberOfFrames;
%----frame size variables------------------------ fr=read(source,1);%read in 1st frame as background frame fr_bw=rgb2gray(fr);%convert background to greyscale fr_size=size(fr); width=source.Width; height=source.Height; fg=zeros(height,width);%to save the foreground pixels bg_bw=zeros(height,width);%to update background |
2. 混合高斯模型预定义
C=3;%number of Gaussian components M=3;%number of background components D=2.5;%positive deviation threshold alpha=0.01; thresh=0.25;%foreground threshold(0.25 or 0.75 in paper) sd_init=6;%initial standard deviation(for new components) w=zeros(height,width,C);%initialize weights array sd=zeros(height,width,C);%pixel means sd=zeros(height,width,C);%pixel standard deviations u_diff=zeros(height,width,C);%difference of each pixel from mean p=alpha/(1/C);%initial p variable(used to update mean and sd) rank=zeros(1,C);%rank of components(w/sd) %----initialize component means and weights---- pixel_depth=8; %8-bit resolution pixel_range=2^pixel_depth-1;%pixel range( of possible values)
for i=1:height for j=1:width for k=1:C mean(i,j,k)=rand*pixel_range; %means random (0-255) w(i,j,k)=1/C;%weights uniformly dist sd(i,j,k)=sd_init;%initialize to sd_init end end end |
3. 混合高斯模型的参数更新
match=0; for k=1:C if(abs(u_diff(i,j,k))<=D*sd(i,j,k))%pixel matches component match=1; %update weights,mean,sd,p w(i,j,k)=(1-alpha)*w(i,j,k)+alpha; p=alpha/w(i,j,k);%p is the updating rate mean(i,j,k)=(1-p)*mean(i,j,k)+p*double(fr_bw(i,j)); sd(i,j,k)=sqrt((1-p)*sd(i,j,k)^2+p*((double(fr_bw(i,j))-mean(i,j,k)))^2); else%pixel does not match component w(i,j,k)=(1-alpha)*w(i,j,k);%weight slightly decreases end end
w(i,j,:)=w(i,j,:)./sum(w(i,j,:));%the sum of gaussian models for each pixel
bg_bw(i,j)=0; for k=1:C bg_bw(i,j)=bg_bw(i,j)+mean(i,j,k)*w(i,j,k);%update background if(bg_bw(i,j)>thresh) k=k-1; M=k; end end
%if no components match,create new component if(match==0) [min_w,min_w_index]=min(w(i,j,:)); mean(i,j,min_w_index)=double(fr_bw(i,j)); sd(i,j,min_w_index)=sd_init; end |
4. 背景模型的选择和前景提取
rank=w(i,j,:)./sd(i,j,:);%calculate component rank rank_ind=[1:1:C];
%sort rank values for k=2:C for m=1:(k-1) if(rank(:,:,k)>rank(:,:,m)) %swap max values rank_temp=rank(:,:,m); rank(:,:,m)=rank(:,:,k); rank(:,:,k)=rank_temp;
%swap max index values rank_ind_temp=rank_ind(m); rank_ind(m)=rank_ind(k); rank_ind(k)=rank_ind_temp; end end end
%calculate foreground match=0; k=1;
fg(i,j)=0; while((match==0)&&(k<=M))%not match,and current GM<BG if(w(i,j,rank_ind(k))>=thresh) if(abs(u_diff(i,j,rank_ind(k)))<=D*sd(i,j,rank_ind(k))) fg(i,j)=0; match=1;%background else fg(i,j)=255;%otherwise is foreground end end k=k+1;%calculate next GM if(k==5) k=k-1; break; end end |
5. 找到前景图中的连通区域
将前景图转换为二值图像,并利用regionprops函数得到连通区域的信息,将包围盒信息存储到rects数组中。
%find the connected region T=graythresh(fg); fg_bw=im2bw(fg,T); fg_reg=regionprops(fg_bw,'area','boundingbox'); areas=[fg_reg.Area]; rects=cat(1,fg_reg.BoundingBox); |
6. 显示检测结果并用方框标注
显示当前处理的视频帧原图、背景图和提取出的前景(运动物体),并在原图中用方框标注运动目标,对于上一步中获得的矩形,当宽高超过我们设定的阈值(此处设为2像素值)时,就绘制红色的矩形。
disp(['当前为第' num2str(n) '帧']); figure(1),subplot(3,1,1),imshow(fr); %show all the connected regions for i=1:size(rects,1) if(rects(i,3)>2&&rects(i,4)>2)%show the rect if it is large enough rectangle('position',rects(i,:),'EdgeColor','r'); end end subplot(3,1,2),imshow(uint8(bg_bw)); subplot(3,1,3),imshow(uint8(fg)); |
三 运行结果
由于初始化背景时采用随机值,需要经过一定的背景更新之后才能获得较为稳定的背景模型。
先对视频visiontraffic.avi进行运动物体检测。在第28帧时,可以看到背景还不是很清晰,噪点很多:
在第101帧时,背景模型已趋于清晰、稳定,对于画面上方出现的汽车,很好地识别了出来:
至此,验证完成了高斯建模分离前景。接下来进行方框的标注。起初,使用regionprops函数时,没有将前景图转化为二值图像,因此识别出的连通区域为整个画面,并不正确。
后来经过更正,能够正确地标注出运动物体,下图为连续运动物体的标注:
对于多个运动物体也能正确地进行标注:
接下来对singlebal.avi进行测试,小球在中途会消失(被盒子遮挡),画面无运动物体。小球出现时能够立刻标注:
小球被遮挡时,画面没有被标注的目标:
小球再次出现,同样能够立刻进行标注:
综上所述,工程能够正确地用方框标注静止背景中的多个运动物体,提取的前景较为干净清晰。由于背景的更新需要大量运算,速度较慢,但基本达到了实时分析视频的要求。
四 总结
在完成基于混合高斯背景建模技术的运动目标检测的过程中,对于高斯建模的原理有了深入的理解,混合高斯模型是用3到5个高斯模型来表征图像中各个点的特征,不断更新、匹配,进行前景的判断的。在反复研读并进行一定的简化之后,顺利用matlab代码实现了这一过程。在尝试用方框标注出检测到的运动目标时遇到了一定的困难,采取了多种方式,最后使用了较为便捷的regionprops函数,将所有连通区域(前景运动目标)的包围盒用红色矩形标注了起来。运动目标的检测有着多种方式,除了混合高斯背景建模以外,还有背景减除法、统计平均法、时间差分法、光流法等,其中,光流法适用于镜头运动的视频。在这个课程设计当中只对固定背景的视频进行了运动目标的检测,实际上混合高斯模型同样适用于运动背景的视频。
附资源链接:点击打开链接