原理:
时间差分法其实就是让视频的两帧做差,从而得到变化的像素,再取一个阈值,小于阈值的变化值忽略,大于阈值的变化值保留下来。它的优点就是算法简单,速度快。
本程序中,阈值是通过多次实验得到的一个针对本视频比较好的一个值,这种方法自适应性比较差,这也是它的一个缺点。代码如下:
%本程序是主程序,用于实现时间差分法进行运行检测
path='e:\test-pic\hall.yuv';
start=1;
stop=30;
yuvx=288;
yuvy=352;
pic1=rgb2gray(loadYUV(path,yuvx,yuvy,start,1));
%%%%%%%%%%%%%%%%%%
%构建高斯滤波算子
%%%%%%%%%%%%%%%%%%
sigma=1;
Gx=floor(3*sigma+0.5);
x=-1*Gx:1*Gx;
y=x;
[x,y]=meshgrid(x,y);
z=1/(2*pi*sigma^2)*exp(-1*(x.^2+y.^2)/(2*sigma.^2));
%高斯算子归一化
z_sum=sum(sum(z));
z=z/z_sum;
mesh(z);
pic1=filter2(z,pic1);
%求时间图像
for i=2:stop-start
pic2_rgb=loadYUV(path,yuvx,yuvy,start+i,1);
pic2=rgb2gray(pic2_rgb);
pic2=filter2(z,pic2);
picmove=abs(pic2-pic1);
pic1=pic2;
picmove(picmove<20)=0;
picmove(picmove>20)=255;
%显示
figure(1);
str=strcat('第',num2str(start+i),'帧');
%text(1,1);
subplot(1,2,1);
imshow(pic2_rgb);
title(str);
subplot(1,2,2);
imshow(uint8(picmove));
pause(0.03);
end
实验效果图如下,这是一个监控的图像,背景是固定的,画面中只有人是移动的,可以看出,摄像头固定的情况下,时间差分法还是比较理想的。