meanshift跟踪算法求助

feizai1hao 2017-05-11 08:55:04
clear all;
rgb=imread('0329.jpg');
figure(1),imshow(rgb);
[temp,rect]=imcrop(rgb); %把图像显示在一个图像窗口中,并允许用户以交互方式使用鼠标选定要剪切的区域并返回.rect=[x,y,width,height].
[a,b,c]=size(temp); %返回X各维的尺寸,并存储在变量d1、d2、……、dn中.其中n(输出参数的个数)必须等于ndims(X)。

%目标中心坐标
y(1)=a/2;
y(2)=b/2;

m_wei=zeros(a,b);%权值矩阵
h=y(1)^2+y(2)^2 ;%带宽

%计算权值矩阵
for i=1:a
for j=1:b
dist=(i-y(1))^2+(j-y(2))^2;
m_wei(i,j)=1-dist/h; %epanechnikov profile
end
end
C=1/sum(sum(m_wei));%归一化系数-----如果A是一个矩阵,sum(A)把A的各列看做一个向量,并返回一个行向量(即一个1行n列的矩阵),这个行向量的第n个元素是A中第n列元素的和;

%计算目标权值直方图qu
%hist1=C*wei_hist(temp,m_wei,a,b);%target model
hist1=zeros(1,4096); % 16*16*16=2^12=4096;主要是因为RGB三色为256区间,除以16之后变成16区间,三个乘积之后就是4096
for i=1:a
for j=1:b
%rgb颜色空间量化为16*16*16 bins
q_r=fix(double(temp(i,j,1))/16); %fix向下取整
q_g=fix(double(temp(i,j,2))/16);
q_b=fix(double(temp(i,j,3))/16);
q_temp=q_r*256+q_g*16+q_b;
hist1(q_temp+1)= hist1(q_temp+1)+m_wei(i,j);
end
end
hist1=hist1*C; % hist1为第一帧上的目标区域的颜色直方图;由于C为权值的和的倒数,因此乘以C的目的在于将hist1中所有数据的和编程单位一,实现归一化操作。
rect(3)=ceil(rect(3)); %ceil向上取整
rect(4)=ceil(rect(4));
jishu=1;

%%%%%%%%%%%%%%%%%%%%%%%%%读取序列图像
for i=0329:0380;
Im=imread(['0',int2str(i),'.jpg']);

jishu=jishu+1;
%Im=medfilt2(Im);
num=0; % 迭代次数;
Y=[2,2]; % 用于更新跟踪区域左上定点坐标; ?????????

tic
%%%%%%%mean shift迭代
while((Y(1)^2+Y(2)^2>0.5)&num<20) %迭代条件
num=num+1;
temp1=imcrop(Im,rect); % 通过找到跟踪目标从上一帧图片到本帧图片的方向向量(巴氏距离)来不断更新rect矩阵
%计算侯选区域直方图
%hist2=C*wei_hist(temp1,m_wei,a,b);%target candidates pu
%
%计算新选择的目标权值直方图qu
hist2=zeros(1,4096);
for i=1:a
for j=1:b
q_r=fix(double(temp1(i,j,1))/16);
q_g=fix(double(temp1(i,j,2))/16);
q_b=fix(double(temp1(i,j,3))/16);
q_temp1(i,j)=q_r*256+q_g*16+q_b;
hist2(q_temp1(i,j)+1)= hist2(q_temp1(i,j)+1)+m_wei(i,j);
end
end
hist2=hist2*C; % hist2为第一帧上的目标区域的颜色直方图;由于C为权值的和的倒数,因此乘以C的目的在于将hist2中所有数据的和编程单位一,实现归一化操作。
%bdist1 = bhattacharyya(hist1, hist2)
w=weights(hist1,hist2); % hist1与hist2的相似度函数,用Bhattacharyya系数表示
% Bhattacharyya距离(以下称巴氏距离)测量的是两个离散或连续概率分布的相似性。
% w=sqrt(hist1./hist2);

%变量初始化
sum_w=0;
xw=[0,0];
for i=1:a;
for j=1:b
bitwei(i,j)=w(uint32(q_temp1(i,j))+1); % 没有使用该矩阵的值; ??????????
sum_w=sum_w+w(uint32(q_temp1(i,j))+1); ??????????
xw=xw+w(uint32(q_temp1(i,j))+1)*[i-y(1)-0.5,j-y(2)-0.5]; % xw是一个1*2的行向量;产生的原因是:w(*)乘了一个1*2的行向量;
end
end
Y=xw/sum_w; % 更新了Y(1)、Y(2);
%中心点位置更新
rect(1)=rect(1)+Y(2);
rect(2)=rect(2)+Y(1);
end

v1=rect(1);
v2=rect(2);
v3=rect(3);
v4=rect(4);

%%显示跟踪结果
figure(2); % 用figure可以控制窗口的数量,即每次只显示一个窗口。
clf; % 在matlab中是为了清除图形窗口中的旧图形
imshow(uint8(Im))
hold on; % 启动图形保持功能,当前坐标轴和图形都将保持,此后绘制的图形都将添加在这个图形之上,并且自动调整坐标轴的范围。
plot([v1,v1+v3],[v2,v2],[v1,v1],[v2,v2+v4],[v1,v1+v3],[v2+v4,v2+v4],[v1+v3,v1+v3],[v2,v2+v4],'LineWidth',2,'Color','w');
% plot:打开一个称为图形窗口的窗口,将坐标轴缩扩以适应并描绘数据。如果已经存在一个图形窗口,则plot命令会清除当前图形窗口的图形,绘制新的图形。
t(jishu)=toc; %统计程序运行时间
end



打问号的行有什么作用?求大神告知!
...全文
759 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,451

社区成员

发帖
与我相关
我的任务
社区描述
多媒体/设计/Flash/Silverlight 开发 图象工具使用
社区管理员
  • 图象工具使用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧