function [center,rmin,rmax,cmin,cmax]=rgbTracking(image,center,w_halfsize,q_u)
% ********************************************************************
% 功能: 实现目标跟踪(基本的mean shift跟踪算法)
% 参数: image 待跟踪的图像序列
% center 目标的初始位置
% w_halfsizet 窗口宽度的一半
% q_u 目标模型
% 返回值:
% center 目标的跟踪结果(窗口宽度和高度仍不变)
% rmin,rmax,cmin,cmax 得到当前帧的跟踪结果窗口位置
%
% 提示: 程序未考虑跟踪窗口出界的情况,实际应用时应加以考虑
%
% ****************************************************************
sum_p=0;
histo=zeros(16,16,16); % 目标候选模型初始化,量化箱格为16-16-16
iterations=0; % 记录每一帧图像的mean shift 迭代次数
center_old=center;
SizeOfFrame = size(image);
% 计算目标窗口的位置
rmin=center(1)-w_halfsize(1);
if(rmin <= 0)
rmin = 1;
end
rmax=center(1)+w_halfsize(1);
if(rmax > SizeOfFrame(1))
rmax = SizeOfFrame(1);
end
cmin=center(2)-w_halfsize(2);
if(cmin <= 0)
cmin = 1;
end
cmax=center(2)+w_halfsize(2);
if(cmax > SizeOfFrame(2))
cmax = SizeOfFrame(2);
end
while 1
wmax=(rmin-center(1)).^2+(cmin-center(2)).^2+0.001;
for i=rmin:rmax % 计算候选模型直方图
for j=cmin:cmax
d=(i-center(1)).^2+(j-center(2)).^2;
w=wmax-d; % 距离越大,权值越小
R=floor(image(i,j,1)/16)+1;
G=floor(image(i,j,2)/16)+1;
B=floor(image(i,j,3)/16)+1;
histo(R,G,B)=histo(R,G,B)+w;
end
end
for i=1:16
for j=1:16
for k=1:16
index=(i-1)*256+(j-1)*16+k;
p_u(index)=histo(i,j,k);
sum_p=sum_p+p_u(index);
end
end
end
% 归一化
p_u=p_u/sum_p; % 特征向量归一化
n=1;
for i=rmin:rmax % 计算其特征向量空间
for j=cmin:cmax
R=floor(image(i,j,1)/16)+1;
G=floor(image(i,j,2)/16)+1;
B=floor(image(i,j,3)/16)+1;
u=(R-1)*256+(G-1)*16+B;
x(1,n)=i;
x(2,n)=j;
w_i(n)=sqrt(q_u(u)/p_u(u))+0.0001;
n=n+1;
end
end
center_r=(x*w_i'/sum(w_i))'; % 新的目标中心(含有小数点)
shift=sqrt(sum((center_r-center_old).^2)); % 计算相邻两次中心的距离
iterations=iterations+1; % 统计meanshift迭代次数
% 判断相邻两次的距离是否小于阈值或达到最大迭代次数
if (shift<0.5 || iterations>10)
break;
end
center_old=center_r; % 保存本次跟踪结果
center = round(center_r); % 四舍五入,因为目标窗口位置必须为整数
% 重新初始化
rmin=center(1)-w_halfsize(1);
if(rmin <= 0)
rmin = 1;
end
rmax=center(1)+w_halfsize(1);
if(rmax > SizeOfFrame(1))
rmax = SizeOfFrame(1);
end
cmin=center(2)-w_halfsize(2);
if(cmin <= 0)
cmin = 1;
end
cmax=center(2)+w_halfsize(2);
if(cmax > SizeOfFrame(2))
cmax = SizeOfFrame(2);
end
histo=zeros(16,16,16); % 相关变量重新赋值
sum_p=0;
end