📄 meanshiftcolorgas.m
字号:
%用高斯核加权得到目标的颜色直方图,Bhattacharyya系数评价直方图匹配程度,meanshift进行均值平移。与基于矩的方法是类似的,不同的是
%矩用高斯核的导数的负数来代替
echo off
clear all
donghua=moviein(300);
%fname='E:\目标跟踪\目标跟踪论文(2006年4月)\capture01.m1v';
fname='E:\标准测试序列\capture01.m1v';
%[R1 G1 B1]=mpgread(fname,250);%黑衣人
%[R1 G1 B1]=mpgread(fname,680); %黄衣人
%[R1 G1 B1]=mpgread(fname,100);%蓝衣女
[R1 G1 B1]=mpgread(fname,100);
[row col]=size(R1);
HSV=rgb2hsv(R1,G1,B1);
H=HSV(:,:,1);
%kuang_x_xia=250;kuang_y_xia=205;%黑衣人
%kuang_x_sh=260;kuang_y_sh=215;
%kuang_x_xia=191;kuang_y_xia=262; %定义初始搜索窗 %黄衣人
%kuang_x_sh=229;kuang_y_sh=280;
%kuang_x_xia=275;kuang_y_xia=135; %蓝衣人
%kuang_x_sh=285;kuang_y_sh=145;
RGB(:,:,1)=R1;
RGB(:,:,2)=G1;
RGB(:,:,3)=B1;
imshow(RGB)
key=waitforbuttonpress;
cp1=get(gca,'CurrentPoint');
kuang_x_xia=cp1(1,2);kuang_y_xia=cp1(1,1);
key=waitforbuttonpress;
cp2=get(gca,'CurrentPoint');
kuang_x_sh=cp2(1,2);kuang_y_sh=cp2(1,1);
R1(kuang_x_xia:kuang_x_sh,kuang_y_xia)=1;G1(kuang_x_xia:kuang_x_sh,kuang_y_xia)=0;B1(kuang_x_xia:kuang_x_sh,kuang_y_xia)=0;
R1(kuang_x_xia:kuang_x_sh,kuang_y_sh)=1;G1(kuang_x_xia:kuang_x_sh,kuang_y_sh)=0;B1(kuang_x_xia:kuang_x_sh,kuang_y_sh)=0;
R1(kuang_x_xia,kuang_y_xia:kuang_y_sh)=1;G1(kuang_x_xia,kuang_y_xia:kuang_y_sh)=0;B1(kuang_x_xia,kuang_y_xia:kuang_y_sh)=0;
R1(kuang_x_sh,kuang_y_xia:kuang_y_sh)=1;G1(kuang_x_sh,kuang_y_xia:kuang_y_sh)=0;B1(kuang_x_sh,kuang_y_xia:kuang_y_sh)=0;
RGB(:,:,1)=R1;
RGB(:,:,2)=G1;
RGB(:,:,3)=B1;
imshow(RGB)
donghua(:,1)=getframe;
imwrite(RGB,'001.bmp')
%计算目标的颜色特征Px,Py
Hint=round(H.*255); %计算Hint中每种颜色出现的频数,Hint:0~255
high=kuang_x_sh-kuang_x_xia+1;
width=kuang_y_sh-kuang_y_xia+1;
x=(kuang_x_xia+kuang_x_sh)/2; %模板中点,真实坐标
y=(kuang_y_xia+kuang_y_sh)/2;
P=[];
for k=1:256;
Px(k)=0; %0~255色对应P的坐标1~256
Py(k)=0;
for i=kuang_x_xia:kuang_x_sh; %i,j是真实坐标
for j=kuang_y_xia:kuang_y_sh;
if(Hint(i,j)-(k-1)==0)
Px(k)=Px(k)+exp(-0.5*((i-x)/high)^2); %基于高斯核的目标密度估计
Py(k)=Py(k)+exp(-0.5*((j-y)/width)^2);
else
Px(k)=Px(k);
Py(k)=Py(k);
end
end
end
Px(k)=Px(k)/(2*pi);
Py(k)=Py(k)/(2*pi);
end
fenmu_x=0;fenmu_y=0;
for i=kuang_x_xia:kuang_x_sh;
for j=kuang_y_xia:kuang_y_sh;
fenmu_x=fenmu_x+exp(-0.5*((i-x)/high)^2);
fenmu_y=fenmu_y+exp(-0.5*((j-y)/width)^2);
end
end
fenmu_x=fenmu_x/(2*pi);fenmu_y=fenmu_y/(2*pi);
Px=Px./fenmu_x;Py=Py./fenmu_y; %目标的颜色特征
%figure
%plot(1:256,P)
for frame=101:300;
[R1 G1 B1]=mpgread(fname,frame);
HSV=rgb2hsv(R1,G1,B1);
H=HSV(:,:,1);
Hint=round(H.*255);
MovSim=0;
for S1=-2:2 %选择多个初始迭代点,避免进入局部最优点
for S2=-2:2;
x=x+high/10*S1;
y=y+width/10*S2;
xc=x+2;yc=y+2; %保证第一次循环能进去
count2=0;
while((abs(x-xc)>1|abs(y-yc)>1)&count2<10)
if(count2>0) %不是第一此循环进入,需要把上次循环计算得到的xc,yc赋值为假定的候选目标中心
x=xc;y=yc;
end
count2=count2+1;
%计算假定的候选目标的颜色特征
Qx=[];Qy=[];
for k=1:256;
Qx(k)=0; %0~255色对应P的坐标1~256
Qy(k)=0;
for i=kuang_x_xia:kuang_x_sh;
for j=kuang_y_xia:kuang_y_sh;
if(Hint(i,j)-(k-1)==0)
Qx(k)=Qx(k)+exp(-0.5*((i-x)/high)^2); %基于高斯核的目标密度估计,x,y是候选目标的中心
Qy(k)=Qy(k)+exp(-0.5*((j-y)/width)^2);
else
Qx(k)=Qx(k);
Qy(k)=Qy(k);
end
end
end
Qx(k)=Qx(k)/(2*pi);
Qy(k)=Qy(k)/(2*pi);
end
% fenmu_x=0;fenmu_y=0;
% for i=kuang_x_xia:kuang_x_sh;
% for j=kuang_y_xia:kuang_y_sh;
% fenmu_x=fenmu_x+exp(-0.5*((i-x)/high)^2);
% fenmu_y=fenmu_y+exp(-0.5*((j-y)/width)^2);
% end
% end
% fenmu_x=fenmu_x/(2*pi);fenmu_y=fenmu_y/(2*pi);
Qx=Qx./fenmu_x;Qy=Qy./fenmu_y; %假定的候选目标的颜色特征
%计算Bhattacharyya系数
Bx=sum((Px.*Qx).^0.5);
By=sum((Py.*Qy).^0.5);
%共有high*width个点,计算每点的权值w
Cx=[];Cy=[];
for k=1:256;
if (Qx(k)==0)
Cx(k)=0;
else
Cx(k)=(Px(k)/Qx(k))^0.5;
end
if (Qy(k)==0)
Cy(k)=0;
else
Cy(k)=(Py(k)/Qy(k))^0.5;
end
end
wx=zeros(row,col);wy=zeros(row,col);%实际只用到high×width个点
for i=kuang_x_xia:kuang_x_sh;
for j=kuang_y_xia:kuang_y_sh;
for k=1:256;
if(Hint(i,j)-(k-1)==0)
wx(i,j)=wx(i,j)+Cx(k);
wy(i,j)=wy(i,j)+Cy(k);
else
wx(i,j)=wx(i,j);
wy(i,j)=wy(i,j);
end
end
end
end
MS_fenzi_x=0;MS_fenzi_y=0;
MS_fenmu_x=0; MS_fenmu_y=0;
for i=kuang_x_xia:kuang_x_sh;
for j=kuang_y_xia:kuang_y_sh;
MS_fenzi_x=MS_fenzi_x+i*wx(i,j)*(((i-x)/high)^2*exp(-0.5*((i-x)/high)^4)/(2*pi));
MS_fenzi_y=MS_fenzi_y+j*wx(i,j)*(((j-y)/width)^2*exp(-0.5*((j-y)/width)^4)/(2*pi));
MS_fenmu_x=MS_fenmu_x+wx(i,j)*(((i-x)/high)^2*exp(-0.5*((i-x)/high)^4)/(2*pi));
MS_fenmu_y=MS_fenmu_y+wx(i,j)*(((j-y)/width)^2*exp(-0.5*((j-y)/width)^4)/(2*pi));
end
end
if(MS_fenmu_x==0)
xc=xc;
else
xc=MS_fenzi_x/MS_fenmu_x; %新的中心
end
if(MS_fenmu_y==0)
yc=yc;
else
yc=MS_fenzi_y/MS_fenmu_y;
end
zj=round(288-high/2);
if(xc>zj)
xc=zj;
end
zj=round(high/2);
if(xc<zj)
xc=zj;
end
zj=round(352-width/2);
if(yc>zj)
yc=zj;
end
zj=round(width/2);
if(yc<zj)
yc=zj;
end
count1=0;BCx=Bx;BCy=By;count=0;
while((BCx<Bx|BCy<By|count1==0)&count<10)%以假定的候选目标为基准,得到最大Bhattacharyya系数对应的目标位置xc,yc
if(count1==0) %第一次进入此while循环
count1=1;
else
xc=(x+xc)/2;yc=(y+yc)/2;
zj=round(288-high/2);
if(xc>zj)
xc=zj;
end
zj=round(high/2);
if(xc<zj)
xc=zj;
end
zj=round(352-width/2);
if(yc>zj)
yc=zj;
end
zj=round(width/2);
if(yc<zj)
yc=zj;
end
end
%以xc,yc为中心画框,计算其颜色特征QC
QCx=[];QCy=[];
for k=1:256;
QCx(k)=0; %0~255色对应P的坐标1~256
QCy(k)=0;
kuang_x_xia=round(xc-(high-1)/2);
kuang_x_sh=round(xc+(high-1)/2);
kuang_y_xia=round(yc-(width-1)/2);
kuang_y_sh=round(yc+(width-1)/2);
for i=kuang_x_xia:kuang_x_sh;
for j=kuang_y_xia:kuang_y_sh;
if(Hint(i,j)-(k-1)==0)
QCx(k)=QCx(k)+exp(-0.5*((i-xc)/high)^2); %基于高斯核的目标密度估计,xc,yc是计算得到的候选目标的中心
QCy(k)=QCy(k)+exp(-0.5*((j-yc)/width)^2);
else
QCx(k)=QCx(k);
QCy(k)=QCy(k);
end
end
end
QCx(k)=QCx(k)/(2*pi);
QCy(k)=QCy(k)/(2*pi);
end
% fenmu_x=0;fenmu_y=0;
% for i=kuang_x_xia:kuang_x_sh;
% for j=kuang_y_xia:kuang_y_sh;
% fenmu_x=fenmu_x+exp(-0.5*((i-x)/high)^2);
% fenmu_y=fenmu_y+exp(-0.5*((j-y)/width)^2);
% end
% end
% fenmu_x=fenmu_x/(2*pi);fenmu_y=fenmu_y/(2*pi);
QCx=QCx./fenmu_x;QCy=QCy./fenmu_y; %候选目标的颜色特征
%计算Bhattacharyya系数
BCx=sum((Px.*QCx).^0.5);
BCy=sum((Py.*QCy).^0.5);
count=count+1;
end %while(BCx<Bx)|(BCy<By)|count<10)
end %while((abs(x-xc)>1)|(abs(y-yc)>1)|count2<10)
BCSim=BCx+BCy;
if(BCSim>MovSim)
MovSim=BCSim;
mubiao_x=xc;
mubiao_y=yc;
end
end % for G2=-2:2
end % for G1=-2:2
kuang_x_xia=round(mubiao_x-(high-1)/2);
kuang_x_sh=round(mubiao_x+(high-1)/2);
kuang_y_xia=round(mubiao_y-(width-1)/2);
kuang_y_sh=round(mubiao_y+(width-1)/2);
R1(kuang_x_xia:kuang_x_sh,kuang_y_xia)=1;G1(kuang_x_xia:kuang_x_sh,kuang_y_xia)=0;B1(kuang_x_xia:kuang_x_sh,kuang_y_xia)=0;
R1(kuang_x_xia:kuang_x_sh,kuang_y_sh)=1;G1(kuang_x_xia:kuang_x_sh,kuang_y_sh)=0;B1(kuang_x_xia:kuang_x_sh,kuang_y_sh)=0;
R1(kuang_x_xia,kuang_y_xia:kuang_y_sh)=1;G1(kuang_x_xia,kuang_y_xia:kuang_y_sh)=0;B1(kuang_x_xia,kuang_y_xia:kuang_y_sh)=0;
R1(kuang_x_sh,kuang_y_xia:kuang_y_sh)=1;G1(kuang_x_sh,kuang_y_xia:kuang_y_sh)=0;B1(kuang_x_sh,kuang_y_xia:kuang_y_sh)=0;
RGB(:,:,1)=R1;
RGB(:,:,2)=G1;
RGB(:,:,3)=B1;
imshow(RGB)
% donghua(:,frame-679)=getframe;
donghua(:,frame-99)=getframe;
if (frame-99) < 10
prefix = '00';
elseif (frame-99) < 100
prefix = '0';
else
prefix = '';
end
imwrite(RGB,strcat(prefix,int2str(frame-99),'.bmp'));
end %for frame=681:750;
movie(donghua)
%定义scope范围内的候选点进行meanshift跟踪
%for k=-2:2
% if(k~=0)
% xs=x+high/2*k;
% ys=y+width/2*k;
% [R2 G2 B2]=mpgread(fname,685);
% HSV=rgb2hsv(R2,G2,B2);
% Hnew=HSV(:,:,1);
% fenzi=0;
% for i=xs-high/2:xs+high/2;
% for j=ys-width/2:ys+width/2;
% fenzi=fenzi+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -