function Delta = tracking(video)
% 功能描述: 目标跟踪
% 如运行: Delta = tracking('SampleVideo.avi');
% ************ 输入的参数 ************
% video ----- AVI图像或cell体( avi = aviread('WeMoveOn.avi');video = {avi.cdata};)
% ************ 输出的参数 ************
% Delta ----- 相邻帧间的差分图像
% ************ 特别强调 ************
% 目标跟踪的方法是对相邻帧求差分图像,根据差分图像以求取运动目标
% ************ 特别强调 ************
% ******************************************************************************************* %
% ---------------------------------*** 模块0: 初始化 ***----------------------------- %
% ------------------------------------------------------------------------------------------- %
% ******************************************************************* %
% ---------*** 将输入的视频读成一个[m,n,3,f]的4D矩阵 ***----------- %
% ---------*** 并将灰度归一化到[0,1] ***----------- %
% ------------------------------------------------------------------- %
if ischar(video)
% Load the video from an avi file.
avi = aviread(video);
pixels = double(cat(4,avi(1:2:end).cdata))/255;
clear avi
else
% Compile the pixel data into a single array
pixels = double(cat(4,video{1:2:end}))/255;
clear video
end
% ******************************************************************* %
% ---------*** 视频数据pixel变成了一个[m,n,f]的3D矩阵 ***---------- %
% ---------*** 并将灰度归一化到[0,1] ***----------- %
% ------------------------------------------------------------------- %
% Convert to RGB to GRAY SCALE image.
[m,n,t,f]=size(pixels);% 行数m,列数n,t==3,帧数f
pixel=zeros(m,n,f);
Delta=zeros(m,n,f);
for k = 1:f
pixel(:,:,k) = (rgb2gray(pixels(:,:,:,k)));
end
% ******************************************************************************************* %
% --------------------*** 模块1: 创建视频输入对象,并显示原始视频 ***----------------- %
% ------------------------------------------------------------------------------------------- %
for k = 2:f
% ******************************************************************* %
% ---------------*** 两帧图像做差分,生成二值化图像 ***------------- %
% ------------------------------------------------------------------- %
Delta(:,:,k)=(abs(pixel(:,:,k)-pixel(:,:,k-1)));% 前后帧图像做差分
Ibw = im2bw(Delta(:,:,k), .2);% 二值化,将图像中灰度大于0.2的像素灰度弄成1,小于0.2的灰度弄成0
Ibw2 = bwlabel(Ibw); % 把连在一起的打标,滤除一些散点
% imshow(Ibw) % 显示二值化后的图像
% imshow(pixel(:,:,k)) % 显示原图像
imshow(pixels(:,:,:,k)) % 显示原图像
hold on % 保留原图信息
% 运动目标的位置示意图
% A(x,y)-------------------
% | |
% | O(x,y) |
% | |
% ------------------D(x,y)
% ******************************************************************* %
% ---------------------*** 找坐标Ay与Dy ***-------------------- %
% ------------------------------------------------------------------- %
ICounter=1;
for i=1:m
for j=1:n
if(Ibw(i,j)>0.5)
Dy = i;
if (ICounter == 1)
Ay=Dy;
end
ICounter=ICounter+1;
break
end
end
end
% ******************************************************************* %
% ---------------------*** 找坐标Ax与Dx ***-------------------- %
% ------------------------------------------------------------------- %
JCounter=1;
for j=1:n
for i=1:m
if(Ibw(i,j)>0.5)
Dx = j;
if (JCounter == 1)
Ax=Dx;
JCounter=JCounter+1;
end
break
end
end
end
% ******************************************************************* %
% ----------------*** 求运动目标的位置并画框 ***--------------- %
% ------------------------------------------------------------------- %
% 运动目标的宽和高
width =Dx-Ax;
height=Dy-Ay;
% 找运动目标的中心坐标(Ox,Oy)
Ox=Ax+width/2;
Oy=Ay+height/2;
% 画框
rectangle('Position',[Ax Ay width height],'EdgeColor','r','LineWidth',2,'LineStyle','--');% [x坐标,y坐标,宽度,高度]
plot(Ox,Oy, 'r*');
drawnow;
% ******************************************************************* %
% ---------------*** 这帧处理完了,下帧重新开张 ***------------- %
% ------------------------------------------------------------------- %
hold off
end
- 1
- 2
- 3
前往页