MeanShift 运 动目标跟踪 matlab 程序 思路简介: 1.截取跟踪目标矩阵rect 2.求取跟踪目标的加权直方图hist1 3.读取视频序列中的一帧, 先随机取一块与rect 等大的矩形,计算加权直方图hist2。 4.计算两者比重函数,如果后者差距过大, 更新新的矩阵中心 Y,进行迭代(MeanShift是一种变步长可以迅速接近概率密度峰值的方法),直至一定条件后停止。 源程序(参考过其他程序): [plain] view plaincopy 1. function [] = select() close all; clear all; %%%%%%%%%%%%%%%%%%根据一幅目标全可见的图像圈定跟踪目标%%%%%%%%%%%%%%%%%%%%%%% I=imread('E:\数字图像处理\6\2\18.bmp'); figure(1); imshow(I); [temp,rect]=imcrop(I); [a,b,c]=size(temp); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%计算目标图像的权值矩阵%%%%%%%%%%%%%%%%%%%%%%% y(1)=a/2; y(2)=b/2; tic_x=rect(1)+rect(3)/2; tic_y=rect(2)+rect(4)/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=C*wei_hist(temp,m_wei,a,b);%target model hist1=zeros(1,a*b); for i=1:a for j=1:b %rgb 颜色空间量化为16*16*16 bins q_r=fix(double(temp(i,j,1))/16); %fix为趋近0 取整函数 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; rect(3)=ceil(rect(3)); rect(4)=ceil(rect(4)); %%%%%%%%%%%%%%%%%%%%%%%%%读取序列图像 myfile=dir('*.bmp'); lengthfile=length(myfile); for l=1:lengthfile Im=imread(myfile(l).name); num=0; Y=[2,2]; %%%%%%%mean shift 迭代 while((Y(1)^2+Y(2)^2>0.5)&num<20) %迭代条件 num=num+1; temp1=imcrop(Im,rect); %计算侯选区域直方图 %hist2=C*wei_hist(temp1,m_wei,a,b);%target candidates pu hist2=zeros(1,a*b); 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_tem...