⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 meanshiftcolorgas.m

📁 this code is a Mean shift example
💻 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 + -