%citation: Comaniciu D,Ramesh V,Meer P Kernel-based object tracking [J]
% IEEE Transaction on Pattern Analysis and Machine Intelligence,2003, 25(5): 564-577
% written by swf
% date: 200812
% 第一帧用鼠标选择要跟踪的物体
clear all;
rgb=imread('0329jpg');
figure(1),imshow(rgb);
[temp,rect]=imcrop(rgb);
[a,b,c]=size(temp);
%目标中心坐标
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));%归一化系数
%计算目标权值直方图qu
%hist1=Cwei_hist(temp,m_wei,a,b);%target model
hist1=zeros(1,4096);
for i=1:a
for j=1:b
%rgb颜色空间量化为161616 bins
q_r=fix(double(temp(i,j,1))/16);
q_g=fix(double(temp(i,j,2))/16);
q_b=fix(double(temp(i,j,3))/16);
q_temp=q_r256+q_g16+q_b;
hist1(q_temp+1)= hist1(q_temp+1)+m_wei(i,j);
end
end
hist1=hist1C;
rect(3)=ceil(rect(3));
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>05)&num<20) %迭代条件
num=num+1;
temp1=imcrop(Im,rect);
%计算侯选区域直方图
%hist2=Cwei_hist(temp1,m_wei,a,b);%target candidates pu
%
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_r256+q_g16+q_b;
hist2(q_temp1(i,j)+1)= hist2(q_temp1(i,j)+1)+m_wei(i,j);
end
end
hist2=hist2C;
%bdist1 = bhattacharyya(hist1, hist2)
w=weights(hist1,hist2);
% 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)-05,j-y(2)-05];
end
end
Y=xw/sum_w
%中心点位置更新
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)
clf
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',1,'Color','w')
t(jishu)=toc; %统计程序运行时间
end
weightm文件
function w=weights(hist1,hist2);
w=zeros(1,4096);
for i=1:4096
if(hist2(i)~=0)
w(i)=sqrt(hist1(i)/hist2(i));
else
w(i)=0;
end
end
returnt=linspace(0,28,10000);%从0到28取10000个点,点越多越精确
x=27t;
y=67sin(16t+45);
dl=sqrt(diff(x)^2+diff(y)^2);%每小段线段长
l=sum(dl); %求总长
disp(l);n个城市,编号为1---n
for循环的次数是蚂蚁重复城市的次数,比如5个蚂蚁放到4个城市,需要重复两遍才能放完蚂蚁,每次循环产生n个1---n的随机数,相当于随机n个城市,产生城市序列
循环结束
Tabu一句表示将m个蚂蚁随机,每个蚂蚁放到前面产生的城市序列中,每个蚂蚁一个城市,需要m个,所以提取前面1:m个序列
'表示转置,没有多大用处,可能参与后面的计算方便。
我感觉如果m,n很大的话,你这样做会产生很大的浪费,计算很多的随机数,这样的话更好,一句就得:(如果变量Randpos后面没有用到的话,如果用到了,还要用你的程序)
Tabu=ceil(nrand(1,m))' Attempted to access path(0,2); index must be a positive integer
or logical这段话表示你引用了错误的矩阵下标0,即path(0,2)。
while path(m(i),terminal)~=terminal这句话表明你的错误出在这里。也就是说,path(m(i),terminal)在运行的过程中出现了path(0,2)的情况,即m这个数组中存在一个i使得m(i)=0不知道你的m是什么,但觉得最有可能的是m(1)=0你检查一下你的数组m吧。看看第一个是不是0。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)