%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%本程序主要用于从视频中读入帧,并且进行从任意位置的连续两帧差分,差分的结果于阈值比较,从而提取出运动目标的轮廓,处理车的效果比人的效果要好
%参数设置 N:处理连续的6帧,start从第100帧开始处理,阈值设置threshold=20
clear all;
clc;
aviinfo('traffic1.avi') %显示视频的信息,视频使用aviread读取之前通过winavi9.0将格式转换为ZJmedia uncompress RGB24
avi=aviread('traffic1.avi'); %使用aviread读取视频,注意视频的格式,aviread读取的视频有格式限制
N=6; %考虑6帧的帧间差分法(需要读取前7帧)
start=20; %start=100,从第100+1帧开始连续读7帧
threshold=50;
for k=1+start:N+1+start %处理从第101到第107帧
avi(k).cdata=rgb2gray(avi(k).cdata); %将彩色图像转换为灰度图像
%avi(k-start).cdata=avi(k).cdata;
end
[hang,lie]=size(avi(1+start).cdata); %以avi(1+start).cdata的格式生成一个矩阵
alldiff=zeros(hang,lie,N); %生成一个三维的矩阵alldiff用于存储最终的各个帧的差分结果
for k=1+start:N+start
diff=abs(avi(k).cdata-avi(k+1).cdata); %邻帧差分
%idiff=diff>20; %二值化,阈值选择为20,阈值调整
idiff=diff>threshold; %idiff中的数据位逻辑值,diff中的数值为unit8
alldiff(:,:,k)=double(idiff); %存储各帧的差分结果,这里为什么要转换成double型的?????
end
%观察帧间差分的二值化结果,这里观察前五帧的相邻两帧差分二值化结果
for k=1+start:N+start
subplot(3,2,k-start),imshow(alldiff(:,:,k)),%title('第1,2帧差分')
title(strcat(num2str(k),'帧','-',num2str(k+1),'帧'));
end