📄 nonpara.m
字号:
%
%功能:对avi视频进行非参数背景估计,和前景提取
%
%%%%%%% 获取并确认avi视频文件,获取视频图像的一些信息 %%%%%%%%%%%%%%%%
close all;
clear all;
clc;
%%%%%%% 获取并确认avi视频文件,获取视频图像的一些信息 %%%%%%%%%%%%%%%%
startF = 0;
while isequal(startF,0)
[fileName,pathName] = uigetfile('*.avi','请选取要播放的视频文件');
if isequal(fileName,0) | isequal(pathName,0)
% 用户按了 ‘取消’ 按钮
msgbox('Thank you for using this program, Good Bye!','程序结束');
return
else
% 用户选择了文件,并按了 ‘确认’ 按钮
videoFileName = fullfile(pathName,fileName);
vInfo = aviinfo(videoFileName);
%%%%%%%%创建一个avi用于保存估计结果%%%%%%%%
% aviFileName1 = fullfile(pathName,[ '228.avi']);
% bmpAvi1 = avifile(aviFileName1);
% bmpAvi1.Fps=10;
numFmVdo = vInfo.NumFrames %视频序列的总帧数
% numFmVdo =100;
% framestar=1;
% numFmVdo =50;
% FNo=numFmVdo-framestar+1;
widthVDO = vInfo.Width; %240
% 视频序列中每一帧图像的宽度; An integer indicating the width of AVI movie
% in pixels
heightVDO = vInfo.Height; %192
%视频序列中每一帧图像的高度;An integer indicating the height of AVI movie in
%pixels
typeVDO = vInfo.ImageType;
%视频序列的类型;- A string indicating the type of image;either
%'truecolor' for a truecolor (RGB) image, or 'indexed', for an
%indexed image
end
startF = 1;
end
%%%%%%%%%%%%%% 读取avi视频文件 %%%%%%%%%%%%%%%%%%%
aviFM = aviread(videoFileName);
aviFileName1 = fullfile(pathName,[ 'result1.avi']);
bmpAvi1 = avifile(aviFileName1);
bmpAvi1.Fps=10;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Channelsize=widthVDO*heightVDO;
%% 3DImatrix(numFmVdo,1Channelsize,value)%%%%%%%%%%%
% %%%%%%%%%%% 对视频图像进行逐帧处理 %%%%%%%%%%%%%%
% H = figure;
% wH=3; wL=2;
%%%%%%%%%
xx=0
% temp=zeros(heightVDO,widthVDO,numFmVdo);
%%%计算初始方差%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for a=1:60
vFn = aviFM(a).cdata; %当前帧图像
vFnGray=rgb2gray(vFn);
recentImage(:,:,a)=vFnGray;
end
cova=2/0.68*2^(1/2); %高斯窗函数的方差
recentImage=double(recentImage);
%建立查找表加快计算速度
for i=1:256
excle(i)=exp(-(i-1)^2/(2*cova^2))/(cova*(2*pi)^(1/2));
end
%%%计算视频背景
background=zeros(heightVDO,widthVDO);
for i=1:heightVDO
% ttt=zeros(1,widthVDO,60,256);
xx=xx+1
% tttt=zeros(1,widthVDO,256);
for t=1:256
ttt=excle(abs(((t-1)-recentImage(i,:,:)))+1);
tt(:,:)=sum(ttt,3);
for r=1:widthVDO
if t==1
max(r)=tt(1,r);
else
if tt(1,r)>max(r)
background(i,r)=t-1;
max(r)=tt(1,r);
end
end
end
end
end
imshow(uint8(background));
for a=1:100
%%通过计算最大的可能值,来计算当前背景
xx=xx+1
vFn = aviFM(a).cdata; %当前帧图像
vFnGray=rgb2gray(vFn);
vFnGray=double(vFnGray);
foreground=vFnGray;
for i=1:60
tempvFn(:,:,i)=vFnGray;
end
cha=excle(abs(tempvFn-recentImage)+1);
ab=sum(cha,3);
for i=1:heightVDO
for j=1:widthVDO
if ab(i,j)>0.2
foreground(i,j)=0;
end
end
end
% foregroud(find(ab>0.1))=0;
recentImage(:,:,mod(a,60)+1)=vFnGray;
groundlast=cat(2,vFnGray,background);
result2=cat(2,groundlast,foreground);
result2=uint8(result2);
rr=cat(3,result2,result2);
rrr=cat(3,rr,result2);
bmpAvi1=addframe(bmpAvi1,rrr);
end
bmpAvi1=close(bmpAvi1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -