基于MeanShift的目标跟踪算法及实现

来源:互联网 发布:防止网站被刷 java 编辑:程序博客网 时间:2024/05/22 16:45

from: http://blog.csdn.net/jinshengtao/article/details/30258833

一、简介

     首先扯扯无参密度估计理论,无参密度估计也叫做非参数估计,属于数理统计的一个分支,和参数密度估计共同构成了概率密度估计方法。参数密度估计方法要求特征空间服从一个已知的概率密度函数,在实际的应用中这个条件很难达到。而无参数密度估计方法对先验知识要求最少,完全依靠训练数据进行估计,并且可以用于任意形状的密度估计。所以依靠无参密度估计方法,即不事先规定概率密度函数的结构形式,在某一连续点处的密度函数值可由该点邻域中的若干样本点估计得出。常用的无参密度估计方法有:直方图法、最近邻域法和核密度估计法。

     MeanShift算法正是属于核密度估计法,它不需要任何先验知识而完全依靠特征空间中样本点的计算其密度函数值。对于一组采样数据,直方图法通常把数据的值域分成若干相等的区间,数据按区间分成若干组,每组数据的个数与总参数个数的比率就是每个单元的概率值;核密度估计法的原理相似于直方图法,只是多了一个用于平滑数据的核函数。采用核函数估计法,在采样充分的情况下,能够渐进地收敛于任意的密度函数,即可以对服从任何分布的数据进行密度估计。

     然后谈谈MeanShift的基本思想及物理含义:

    此外,从公式1中可以看到,只要是落入Sh的采样点,无论其离中心x的远近,对最终的Mh(x)计算的贡献是一样的。然而在现实跟踪过程中,当跟踪目标出现遮挡等影响时,由于外层的像素值容易受遮挡或背景的影响,所以目标模型中心附近的像素比靠外的像素更可靠。因此,对于所有采样点,每个样本点的重要性应该是不同的,离中心点越远,其权值应该越小。故引入核函数和权重系数来提高跟踪算法的鲁棒性并增加搜索跟踪能力。

      接下来,谈谈核函数:

    核函数也叫窗口函数,在核估计中起到平滑的作用。常用的核函数有:Uniform,Epannechnikov,Gaussian等。本文算法只用到了Epannechnikov,它数序定义如下:

二、基于MeanShift的目标跟踪算法

     基于均值漂移的目标跟踪算法通过分别计算目标区域和候选区域内像素的特征值概率得到关于目标模型和候选模型的描述,然后利用相似函数度量初始帧目标模型和当前帧的候选模版的相似性,选择使相似函数最大的候选模型并得到关于目标模型的Meanshift向量,这个向量正是目标由初始位置向正确位置移动的向量。由于均值漂移算法的快速收敛性,通过不断迭代计算Meanshift向量,算法最终将收敛到目标的真实位置,达到跟踪的目的。

     下面通过图示直观的说明MeanShift跟踪算法的基本原理。如下图所示:目标跟踪开始于数据点xi0(空心圆点xi0,xi1,…,xiN表示的是中心点,上标表示的是的迭代次数,周围的黑色圆点表示不断移动中的窗口样本点,虚线圆圈代表的是密度估计窗口的大小)。箭头表示样本点相对于核函数中心点的漂移向量,平均的漂移向量会指向样本点最密集的方向,也就是梯度方向。因为 Meanshift 算法是收敛的,因此在当前帧中通过反复迭代搜索特征空间中样本点最密集的区域,搜索点沿着样本点密度增加的方向“漂移”到局部密度极大点点xiN,也就是被认为的目标位置,从而达到跟踪的目的,MeanShift 跟踪过程结束。

 

 

运动目标的实现过程【具体算法】:

 

三、代码实现

说明:

1.       RGB颜色空间刨分,采用16*16*16的直方图

2.       目标模型和候选模型的概率密度计算公式参照上文

3.       OpenCV版本运行:按P停止,截取目标,再按P,进行单目标跟踪

4.       Matlab版本,将视频改为图片序列,第一帧停止,手工标定目标,双击目标区域,进行单目标跟踪。

 

matlab版本:

 

[plain] view plain copy 在CODE上查看代码片派生到我的代码片
  1. function [] = select()  
  2. close all;  
  3. clear all;  
  4. %%%%%%%%%%%%%%%%%%根据一幅目标全可见的图像圈定跟踪目标%%%%%%%%%%%%%%%%%%%%%%%  
  5. I=imread('result72.jpg');  
  6. figure(1);  
  7. imshow(I);  
  8.   
  9.   
  10. [temp,rect]=imcrop(I);  
  11. [a,b,c]=size(temp);         %a:row,b:col  
  12.   
  13.   
  14. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%计算目标图像的权值矩阵%%%%%%%%%%%%%%%%%%%%%%%  
  15. y(1)=a/2;  
  16. y(2)=b/2;  
  17. tic_x=rect(1)+rect(3)/2;  
  18. tic_y=rect(2)+rect(4)/2;  
  19. m_wei=zeros(a,b);%权值矩阵  
  20. h=y(1)^2+y(2)^2 ;%带宽  
  21.   
  22.   
  23. for i=1:a  
  24.     for j=1:b  
  25.         dist=(i-y(1))^2+(j-y(2))^2;  
  26.         m_wei(i,j)=1-dist/h; %epanechnikov profile  
  27.     end  
  28. end  
  29. C=1/sum(sum(m_wei));%归一化系数  
  30.   
  31.   
  32. %计算目标权值直方图qu  
  33. %hist1=C*wei_hist(temp,m_wei,a,b);%target model  
  34. hist1=zeros(1,4096);  
  35. for i=1:a  
  36.     for j=1:b  
  37.         %rgb颜色空间量化为16*16*16 bins  
  38.         q_r=fix(double(temp(i,j,1))/16);  %fix为趋近0取整函数  
  39.         q_g=fix(double(temp(i,j,2))/16);  
  40.         q_b=fix(double(temp(i,j,3))/16);  
  41.         q_temp=q_r*256+q_g*16+q_b;            %设置每个像素点红色、绿色、蓝色分量所占比重  
  42.         hist1(q_temp+1)= hist1(q_temp+1)+m_wei(i,j);    %计算直方图统计中每个像素点占的权重  
  43.     end  
  44. end  
  45. hist1=hist1*C;  
  46. rect(3)=ceil(rect(3));  
  47. rect(4)=ceil(rect(4));  
  48.   
  49.   
  50.   
  51.   
  52. %%%%%%%%%%%%%%%%%%%%%%%%%读取序列图像  
  53. myfile=dir('D:\matlab7\work\mean shift\image\*.jpg');  
  54. lengthfile=length(myfile);  
  55.   
  56.   
  57. for l=1:lengthfile  
  58.     Im=imread(myfile(l).name);  
  59.     num=0;  
  60.     Y=[2,2];  
  61.       
  62.       
  63.     %%%%%%%mean shift迭代  
  64.     while((Y(1)^2+Y(2)^2>0.5)&num<20)   %迭代条件  
  65.         num=num+1;  
  66.         temp1=imcrop(Im,rect);  
  67.         %计算侯选区域直方图  
  68.         %hist2=C*wei_hist(temp1,m_wei,a,b);%target candidates pu  
  69.         hist2=zeros(1,4096);  
  70.         for i=1:a  
  71.             for j=1:b  
  72.                 q_r=fix(double(temp1(i,j,1))/16);  
  73.                 q_g=fix(double(temp1(i,j,2))/16);  
  74.                 q_b=fix(double(temp1(i,j,3))/16);  
  75.                 q_temp1(i,j)=q_r*256+q_g*16+q_b;  
  76.                 hist2(q_temp1(i,j)+1)= hist2(q_temp1(i,j)+1)+m_wei(i,j);  
  77.             end  
  78.         end  
  79.         hist2=hist2*C;  
  80.         figure(2);  
  81.         subplot(1,2,1);  
  82.         plot(hist2);  
  83.         hold on;  
  84.           
  85.         w=zeros(1,4096);  
  86.         for i=1:4096  
  87.             if(hist2(i)~=0) %不等于  
  88.                 w(i)=sqrt(hist1(i)/hist2(i));  
  89.             else  
  90.                 w(i)=0;  
  91.             end  
  92.         end  
  93.           
  94.           
  95.           
  96.         %变量初始化  
  97.         sum_w=0;  
  98.         xw=[0,0];  
  99.         for i=1:a;  
  100.             for j=1:b  
  101.                 sum_w=sum_w+w(uint32(q_temp1(i,j))+1);  
  102.                 xw=xw+w(uint32(q_temp1(i,j))+1)*[i-y(1)-0.5,j-y(2)-0.5];  
  103.             end  
  104.         end  
  105.         Y=xw/sum_w;  
  106.         %中心点位置更新  
  107.         rect(1)=rect(1)+Y(2);  
  108.         rect(2)=rect(2)+Y(1);  
  109.     end  
  110.       
  111.       
  112.     %%%跟踪轨迹矩阵%%%  
  113.     tic_x=[tic_x;rect(1)+rect(3)/2];  
  114.     tic_y=[tic_y;rect(2)+rect(4)/2];  
  115.       
  116.     v1=rect(1);  
  117.     v2=rect(2);  
  118.     v3=rect(3);  
  119.     v4=rect(4);  
  120.     %%%显示跟踪结果%%%  
  121.     subplot(1,2,2);  
  122.     imshow(uint8(Im));  
  123.     title('目标跟踪结果及其运动轨迹');  
  124.     hold on;  
  125.     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','r');  
  126.     plot(tic_x,tic_y,'LineWidth',2,'Color','b');  
  127.       
  128.       
  129. end  


 运行结果:

 

 

 

opencv版本:

[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
  1. #include "stdafx.h"  
  2. #include "cv.h"  
  3. #include "highgui.h"  
  4. #define  u_char unsigned char  
  5. #define  DIST 0.5  
  6. #define  NUM 20  
  7.   
  8. //全局变量  
  9. bool pause = false;  
  10. bool is_tracking = false;  
  11. CvRect drawing_box;  
  12. IplImage *current;  
  13. double *hist1, *hist2;  
  14. double *m_wei;                                                                  //权值矩阵  
  15. double C = 0.0;                                                                //归一化系数  
  16.   
  17. void init_target(double *hist1, double *m_wei, IplImage *current)  
  18. {  
  19.     IplImage *pic_hist = 0;  
  20.     int t_h, t_w, t_x, t_y;  
  21.     double h, dist;  
  22.     int i, j;  
  23.     int q_r, q_g, q_b, q_temp;  
  24.       
  25.     t_h = drawing_box.height;  
  26.     t_w = drawing_box.width;  
  27.     t_x = drawing_box.x;  
  28.     t_y = drawing_box.y;  
  29.   
  30.     h = pow(((double)t_w)/2,2) + pow(((double)t_h)/2,2);            //带宽  
  31.     pic_hist = cvCreateImage(cvSize(300,200),IPL_DEPTH_8U,3);     //生成直方图图像  
  32.   
  33.     //初始化权值矩阵和目标直方图  
  34.     for (i = 0;i < t_w*t_h;i++)  
  35.     {  
  36.         m_wei[i] = 0.0;  
  37.     }  
  38.   
  39.     for (i=0;i<4096;i++)  
  40.     {  
  41.         hist1[i] = 0.0;  
  42.     }  
  43.   
  44.     for (i = 0;i < t_h; i++)  
  45.     {  
  46.         for (j = 0;j < t_w; j++)  
  47.         {  
  48.             dist = pow(i - (double)t_h/2,2) + pow(j - (double)t_w/2,2);  
  49.             m_wei[i * t_w + j] = 1 - dist / h;   
  50.             //printf("%f\n",m_wei[i * t_w + j]);  
  51.             C += m_wei[i * t_w + j] ;  
  52.         }  
  53.     }  
  54.   
  55.     //计算目标权值直方  
  56.     for (i = t_y;i < t_y + t_h; i++)  
  57.     {  
  58.         for (j = t_x;j < t_x + t_w; j++)  
  59.         {  
  60.             //rgb颜色空间量化为16*16*16 bins  
  61.             q_r = ((u_char)current->imageData[i * current->widthStep + j * 3 + 2]) / 16;  
  62.             q_g = ((u_char)current->imageData[i * current->widthStep + j * 3 + 1]) / 16;  
  63.             q_b = ((u_char)current->imageData[i * current->widthStep + j * 3 + 0]) / 16;  
  64.             q_temp = q_r * 256 + q_g * 16 + q_b;  
  65.             hist1[q_temp] =  hist1[q_temp] +  m_wei[(i - t_y) * t_w + (j - t_x)] ;  
  66.         }  
  67.     }  
  68.   
  69.     //归一化直方图  
  70.     for (i=0;i<4096;i++)  
  71.     {  
  72.         hist1[i] = hist1[i] / C;  
  73.         //printf("%f\n",hist1[i]);  
  74.     }  
  75.   
  76.     //生成目标直方图  
  77.     double temp_max=0.0;  
  78.   
  79.     for (i = 0;i < 4096;i++)         //求直方图最大值,为了归一化  
  80.     {  
  81.         //printf("%f\n",val_hist[i]);  
  82.         if (temp_max < hist1[i])  
  83.         {  
  84.             temp_max = hist1[i];  
  85.         }  
  86.     }  
  87.     //画直方图  
  88.     CvPoint p1,p2;  
  89.     double bin_width=(double)pic_hist->width/4096;  
  90.     double bin_unith=(double)pic_hist->height/temp_max;  
  91.   
  92.     for (i = 0;i < 4096; i++)  
  93.     {  
  94.         p1.x = i * bin_width;  
  95.         p1.y = pic_hist->height;  
  96.         p2.x = (i + 1)*bin_width;  
  97.         p2.y = pic_hist->height - hist1[i] * bin_unith;  
  98.         //printf("%d,%d,%d,%d\n",p1.x,p1.y,p2.x,p2.y);  
  99.         cvRectangle(pic_hist,p1,p2,cvScalar(0,255,0),-1,8,0);  
  100.     }  
  101.     cvSaveImage("hist1.jpg",pic_hist);  
  102.     cvReleaseImage(&pic_hist);  
  103. }  
  104.   
  105. void MeanShift_Tracking(IplImage *current)  
  106. {  
  107.     int num = 0, i = 0, j = 0;  
  108.     int t_w = 0, t_h = 0, t_x = 0, t_y = 0;  
  109.     double *w = 0, *hist2 = 0;  
  110.     double sum_w = 0, x1 = 0, x2 = 0,y1 = 2.0, y2 = 2.0;  
  111.     int q_r, q_g, q_b;  
  112.     int *q_temp;  
  113.     IplImage *pic_hist = 0;  
  114.   
  115.     t_w = drawing_box.width;  
  116.     t_h = drawing_box.height;  
  117.       
  118.     pic_hist = cvCreateImage(cvSize(300,200),IPL_DEPTH_8U,3);     //生成直方图图像  
  119.     hist2 = (double *)malloc(sizeof(double)*4096);  
  120.     w = (double *)malloc(sizeof(double)*4096);  
  121.     q_temp = (int *)malloc(sizeof(int)*t_w*t_h);  
  122.   
  123.     while ((pow(y2,2) + pow(y1,2) > 0.5)&& (num < NUM))  
  124.     {  
  125.         num++;  
  126.         t_x = drawing_box.x;  
  127.         t_y = drawing_box.y;  
  128.         memset(q_temp,0,sizeof(int)*t_w*t_h);  
  129.         for (i = 0;i<4096;i++)  
  130.         {  
  131.             w[i] = 0.0;  
  132.             hist2[i] = 0.0;  
  133.         }  
  134.   
  135.         for (i = t_y;i < t_h + t_y;i++)  
  136.         {  
  137.             for (j = t_x;j < t_w + t_x;j++)  
  138.             {  
  139.                 //rgb颜色空间量化为16*16*16 bins  
  140.                 q_r = ((u_char)current->imageData[i * current->widthStep + j * 3 + 2]) / 16;  
  141.                 q_g = ((u_char)current->imageData[i * current->widthStep + j * 3 + 1]) / 16;  
  142.                 q_b = ((u_char)current->imageData[i * current->widthStep + j * 3 + 0]) / 16;  
  143.                 q_temp[(i - t_y) *t_w + j - t_x] = q_r * 256 + q_g * 16 + q_b;  
  144.                 hist2[q_temp[(i - t_y) *t_w + j - t_x]] =  hist2[q_temp[(i - t_y) *t_w + j - t_x]] +  m_wei[(i - t_y) * t_w + j - t_x] ;  
  145.             }  
  146.         }  
  147.   
  148.         //归一化直方图  
  149.         for (i=0;i<4096;i++)  
  150.         {  
  151.             hist2[i] = hist2[i] / C;  
  152.             //printf("%f\n",hist2[i]);  
  153.         }  
  154.         //生成目标直方图  
  155.         double temp_max=0.0;  
  156.   
  157.         for (i=0;i<4096;i++)         //求直方图最大值,为了归一化  
  158.         {  
  159.             if (temp_max < hist2[i])  
  160.             {  
  161.                 temp_max = hist2[i];  
  162.             }  
  163.         }  
  164.         //画直方图  
  165.         CvPoint p1,p2;  
  166.         double bin_width=(double)pic_hist->width/(4368);  
  167.         double bin_unith=(double)pic_hist->height/temp_max;  
  168.   
  169.         for (i = 0;i < 4096; i++)  
  170.         {  
  171.             p1.x = i * bin_width;  
  172.             p1.y = pic_hist->height;  
  173.             p2.x = (i + 1)*bin_width;  
  174.             p2.y = pic_hist->height - hist2[i] * bin_unith;  
  175.             cvRectangle(pic_hist,p1,p2,cvScalar(0,255,0),-1,8,0);  
  176.         }  
  177.         cvSaveImage("hist2.jpg",pic_hist);  
  178.       
  179.         for (i = 0;i < 4096;i++)  
  180.         {  
  181.             if (hist2[i] != 0)  
  182.             {  
  183.                 w[i] = sqrt(hist1[i]/hist2[i]);  
  184.             }else  
  185.             {  
  186.                 w[i] = 0;  
  187.             }  
  188.         }  
  189.               
  190.         sum_w = 0.0;  
  191.         x1 = 0.0;  
  192.         x2 = 0.0;  
  193.   
  194.         for (i = 0;i < t_h; i++)  
  195.         {  
  196.             for (j = 0;j < t_w; j++)  
  197.             {  
  198.                 //printf("%d\n",q_temp[i * t_w + j]);  
  199.                 sum_w = sum_w + w[q_temp[i * t_w + j]];  
  200.                 x1 = x1 + w[q_temp[i * t_w + j]] * (i - t_h/2);  
  201.                 x2 = x2 + w[q_temp[i * t_w + j]] * (j - t_w/2);  
  202.             }  
  203.         }  
  204.         y1 = x1 / sum_w;  
  205.         y2 = x2 / sum_w;  
  206.           
  207.         //中心点位置更新  
  208.         drawing_box.x += y2;  
  209.         drawing_box.y += y1;  
  210.   
  211.         //printf("%d,%d\n",drawing_box.x,drawing_box.y);  
  212.     }  
  213.     free(hist2);  
  214.     free(w);  
  215.     free(q_temp);  
  216.     //显示跟踪结果  
  217.     cvRectangle(current,cvPoint(drawing_box.x,drawing_box.y),cvPoint(drawing_box.x+drawing_box.width,drawing_box.y+drawing_box.height),CV_RGB(255,0,0),2);  
  218.     cvShowImage("Meanshift",current);  
  219.     //cvSaveImage("result.jpg",current);  
  220.     cvReleaseImage(&pic_hist);  
  221. }  
  222.   
  223. void onMouse( int event, int x, int y, int flags, void *param )  
  224. {  
  225.     if (pause)  
  226.     {  
  227.         switch(event)  
  228.         {  
  229.         case CV_EVENT_LBUTTONDOWN:   
  230.             //the left up point of the rect  
  231.             drawing_box.x=x;  
  232.             drawing_box.y=y;  
  233.             break;  
  234.         case CV_EVENT_LBUTTONUP:  
  235.             //finish drawing the rect (use color green for finish)  
  236.             drawing_box.width=x-drawing_box.x;  
  237.             drawing_box.height=y-drawing_box.y;  
  238.             cvRectangle(current,cvPoint(drawing_box.x,drawing_box.y),cvPoint(drawing_box.x+drawing_box.width,drawing_box.y+drawing_box.height),CV_RGB(255,0,0),2);  
  239.             cvShowImage("Meanshift",current);  
  240.               
  241.             //目标初始化  
  242.             hist1 = (double *)malloc(sizeof(double)*16*16*16);  
  243.             m_wei =  (double *)malloc(sizeof(double)*drawing_box.height*drawing_box.width);  
  244.             init_target(hist1, m_wei, current);  
  245.             is_tracking = true;  
  246.             break;  
  247.         }  
  248.         return;  
  249.     }  
  250. }  
  251.   
  252.   
  253.   
  254. int _tmain(int argc, _TCHAR* argv[])  
  255. {  
  256.     CvCapture *capture=cvCreateFileCapture("test.avi");  
  257.     current = cvQueryFrame(capture);  
  258.     char res[20];  
  259.     int nframe = 0;  
  260.   
  261.     while (1)  
  262.     {     
  263.     /*  sprintf(res,"result%d.jpg",nframe); 
  264.         cvSaveImage(res,current); 
  265.         nframe++;*/  
  266.         if(is_tracking)  
  267.         {  
  268.             MeanShift_Tracking(current);  
  269.         }  
  270.   
  271.         int c=cvWaitKey(1);  
  272.         //暂停  
  273.         if(c == 'p')   
  274.         {  
  275.             pause = true;  
  276.             cvSetMouseCallback( "Meanshift", onMouse, 0 );  
  277.         }  
  278.         while(pause){  
  279.             if(cvWaitKey(0) == 'p')  
  280.                 pause = false;  
  281.         }  
  282.         cvShowImage("Meanshift",current);  
  283.         current = cvQueryFrame(capture); //抓取一帧  
  284.     }  
  285.   
  286.     cvNamedWindow("Meanshift",1);  
  287.     cvReleaseCapture(&capture);  
  288.     cvDestroyWindow("Meanshift");  
  289.     return 0;  
  290. }  

运行结果:

 

初始目标直方图:


候选目标直方图:

code: http://download.csdn.net/detail/real_myth/9717307



48楼 planc2016-07-28 20:02发表 [回复] [引用][举报]
模板直方图hist1一直没更新过?那物体形变多了不是会跟丢
47楼 Legenas2016-05-20 09:46发表 [回复]
博主,代码链接失效了,能不能再发一份呢?
Re: 两个小西瓜2016-07-15 14:48发表 [回复]
回复Legenas:你好,麻烦问一下你的可以运行成功吗?
46楼 我打天涯走过2016-05-18 20:29发表 [回复]
q_temp=q_r*256+q_g*16+q_b; %设置每个像素点红色,黄色,蓝色分量所占比重 这句不知道是什么意思
45楼 我打天涯走过2016-05-18 20:29发表 [回复]
不是很懂,慢慢看,慢慢来
44楼 maimai1342016-05-05 22:58发表 [回复]
相似函数体现在哪里?
Re: sinat_333830572016-08-30 14:51发表 [回复]
回复maimai134:你好我想问一下,你找到相似函数是怎么体现的了嘛 ?
43楼 天上有时下牛2016-04-18 16:44发表 [回复]
请问,我是用同样的程序,目标区域的直方图正常,可候选区域的直方图是错误的,只有一条竖线,而且跟踪的框一直不懂??
42楼 qq_345946512016-04-09 10:03发表 [回复]
请问什么是目标全可见的图片,您的result72.jpg是什么样子的图片
41楼 wtyxzy2016-03-25 13:51发表 [回复]
你好 请问为什么经常会出现这样的错误:Attempted to access temp1(98,1,1); index out of bounds because size(temp1)=[97,80,3]., 矩形的大小一直是不变的,为什么截取的图片大小会不一样啊
40楼 那年聪聪2016-03-11 14:29发表 [回复]
为什么在“2、候选模型描述”那里是以上一帧的中心位置为搜索窗口,但是在“运动目标的实现过程【具体算法】”处和“程序实现”时都采用的是以初始目标中心点位置为搜索窗口?
39楼 11068891822016-03-07 08:19发表 [回复]
感觉真心不错
38楼 team792016-03-01 14:54发表 [回复]
公式的推倒还是不是特别明白,还有你在实现的时候省略了g的计算 不是特别明白。我想转载一下
37楼 baidu_338256102016-01-22 21:23发表 [回复]
谢谢楼主,学习中
36楼 倒霉蛋蛋0352016-01-05 09:52发表 [回复]
学习了!!!
35楼 lgs1254782015-12-29 20:42发表 [回复]
博主,您好,看了你的博客,感觉是不是少了点东西,就是在选择目标模板以后,在后面跟踪时就没有体现meanShift算法的思想?少了反向直方图了是不是?
34楼 krystal7272015-12-08 16:22发表 [回复]
请教,matlab程序运行出来了,但是figure2出来的图像和figure1是同一张,是什么原因呢
33楼 sinat_278087032015-12-04 11:29发表 [回复]
感谢作者分享
32楼 JR_Smart2015-12-03 09:41发表 [回复]
非常感谢,可用
31楼 kunsiri2015-11-21 13:29发表 [回复]
运行完出了figure1,然后双击目标区域就成了下面这样了,咋回事?
Warning: Divide by zero.
> In meanshift at 30
??? Error using ==> imread
File "result100.jpg" does not exist.

Error in ==> meanshift at 59
Im=imread(myfile(l).name);
30楼 csdnyiqixuexiba2015-11-19 16:10发表 [回复]
楼主你好,我用的opencv的版本可以运行,但是为什么选定目标之后,目标移动后总是跟丢呢
29楼 sinat_322574632015-11-10 19:18发表 [回复]
楼主,求素材,程序学习中......
28楼 zhuihun1402015-10-06 16:04发表 [回复]
请问素材在哪里可以找到
27楼 mc123456112015-09-17 17:18发表 [回复]
谢谢,顶
26楼 qq_300789172015-08-31 19:32发表 [回复]
博主,为什么matlab的运行出来只有一张图片?
Re: hlinghoney2015-10-14 17:35发表 [回复]
回复qq_30078917:同问
25楼 莎兰2015-08-24 21:09发表 [回复]
你好,我用不同的数据测试,有时会出现如下问题:
Attempted to access temp(1,1,2); index out of bounds because size(temp)=[35,28,1].

Error in MeanShiftDemo (line 46)
q_g=fix(double(temp(i,j,2))/16);

请问,我该如何解决?
我觉得原因是我还不理解下面这段代码的含义:
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
谢谢,麻烦指导一下
Re: tianzhiyihe2015-08-28 21:11发表 [回复]
回复莎兰:你的问题是temp[:,:,1]是单通道图像,你去访问它的第二通道temp[:,:2],当然出错了。要正确运行只要令下面的q_g,q_b=0,就行了。
Re: 莎兰2015-09-02 16:30发表 [回复]
回复tianzhiyihe:谢谢,这个问题解决了!不过 我有个新问题(能不能加一下QQ:617423023)

Attempted to access m_wei(1,89); index out of bounds because size(m_wei)=[320,88].

问题分析:我觉得当imcrop中给出的矩形(x,y,w,h)当x,y有负数时就会出现这个问题,我该如何解决?难道要把m_wei的计算放入整个循环过程吗?
24楼 fswy20152015-08-14 11:57发表 [回复]
q_temp = q_r * 256 + q_g * 16 + q_b;这句怎么理解?
Re: Shield_Wang2015-08-28 10:25发表 [回复]
回复fswy2015:对啊,权重为什么要这么设置
Re: xiaohuilang62015-10-12 17:03发表 [回复]
回复Shield_Wang:如果颜色空间为灰度空间,则梯度直方图区间为0-255,如果划分为16份,就是0-15,如果颜色空间为rgb,一样的,就是16*16*16的大小的直方图
23楼 阳_子_阳2015-07-28 17:25发表 [回复]
可以试试
22楼 yang_yang52013142015-07-14 16:39发表 [回复]
公式好复杂,慢慢理解!
21楼 wubing9111272015-07-14 15:49发表 [回复]
很好
Re: sxakhyct2015-08-26 16:08发表 [回复]
回复wubing911127:m_wei(i,j)=1-dist/h 为什么是1-dist/h啊,按照文章中的公式,貌似直接是m_wei(i,j)=dist/h啊?
Re: sinat_298229572015-07-16 20:26发表 [回复]
回复wubing911127:你好,我运行的是matlab的代码,为什么只出来了figure1而且没有报错。
20楼 yaoxingfu722015-07-12 14:20发表 [回复]
matlab程序第59行有错误:
image文件夹的路径并没有加上。imread函数搜索不到image文件中。作者并没有加上。
解决办法:1.在函数开始的时候把image文件夹路径加上。
2.imread(['./image/',myfile(l).name]);
19楼 yaoxingfu722015-07-12 14:19发表 [回复]
image文件夹的路径并没有加上。imread函数搜索不到image文件中。作者并没有加上。matlab程序第59行
解决办法:1.在函数开始的时候把image文件夹路径加上。
2.imread(['./image/',myfile(l).name]);
Re: krystal7272015-12-07 10:39发表 [回复]
回复yaoxingfu72:能具体解释一下,['./image/',myfile(l).name]每个部分代表什么意思么,新手求助
Re: sinat_346156122016-04-11 10:31发表 [回复]
回复krystal727:这个不就是绝对路径吗?
Re: kunsiri2015-11-20 17:19发表 [回复]
回复yaoxingfu72:到底怎么改路径啊,按你那么改还是不行啊
Re: Shield_Wang2015-08-27 16:01发表 [回复]
回复yaoxingfu72:按照你的说法,成功了
18楼 suiyue_defan2015-06-19 10:27发表 [回复]
xw=xw+w(uint32(q_temp1(i,j))+1)*[i-y(1)-0.5,j-y(2)-0.5];这句中为什么减0.5呢?
Re: 愤怒的菜菜鸟2015-08-10 14:21发表 [回复]
回复suiyue_defan:减0.5是对计算精度的控制
Re: R-e-D2015-07-06 15:00发表 [回复]
回复suiyue_defan:我也有同样的疑问,不知道你解决了吗?同求
17楼 佼者无谓2015-06-15 12:59发表 [回复]
想问个很基础的问题,为什么没看到主函数?这个demo主函数编译器程序接口是哪个。
16楼 fyy198702012015-05-13 12:19发表 [回复]
很有收获。
15楼 tianldn2015-05-11 13:03发表 [回复]
运行mltlab,断定目标区域,双击后没有反应,应该怎么做啊
14楼 hanxiaodongege2015-05-04 16:01发表 [回复]
运行了 怎么没反应呢 是不是我直接复制的?
13楼 KLORDLY2015-04-09 13:30发表 [回复]
lz您好,之前看了你那个基于MeanShift的目标跟踪,我用opencv2.4.5和microsoft visual studio 2012 运行,可以跟踪,但很快会出现“0xC0000005: 读取位置 0x00000048 时发生访问冲突。”这是怎么回事,谢谢!
Re: chuhoat2016-03-23 08:48发表 [回复]
回复KLORDLY:同样的问题,你已经解决了没有?
Re: KLORDLY2016-04-22 15:21发表 [回复]
回复chuhoat:恩,解决了
12楼 LCRopencv2015-04-09 10:01发表 [回复]
博主你好,我刚开始学习meanshift,看了你的博客受益匪浅,非常详细到位,我都能理解。不过我还想学习如何让窗口自适应的算法和代码,我自己找了两天也没学懂。希望博主能指点一下,谢谢。
11楼 KLORDLY2015-04-02 15:55发表 [回复]
那个myfile(l)是什么文件,我是不是只需要把这个改一下就可以运行了,在opencv2.4.5上,谢谢楼主了!
10楼 myt5849149772015-03-09 09:41发表 [回复]
运行mltlab,断定目标区域,双击后没有反应,应该怎么做啊 新手求教哇
9楼 zzzhaut2015-03-06 19:06发表 [回复]
问题解决没有?
8楼 fangqing0012015-01-28 15:20发表 [回复]
xw=xw+w(uint32(q_temp1(i,j))+1)*[i-y(1)-0.5,j-y(2)-0.5] 请问这一句目的是什么呢?新手一枚,谢谢指教!
7楼 inmiracle2015-01-20 10:40发表 [回复]
写的很好,上节不是说基于卡尔曼实现吗
6楼 山寨小哥2015-01-04 16:35发表 [回复]
Epanechnikov profile不是平方形式,而是一次的,只不过输入的是x的2范数,所以导数为常数
5楼 Fanatic3572014-10-27 15:42发表 [回复]
楼主博文不错喔,增长不少知识。
请问能说一下你的硕士毕业论文名称吗,谢谢了。
学生一枚,也是研究这方面的。
4楼 chongziyang2014-10-11 19:26发表 [回复]
请问Y表示的是什么呢,是偏移量么?
还有就是怎么保证BH系数是最大的呢?越看越糊涂了,望指导。能交流下么,最近小弟在研究这个,扣扣823691966
Re: sinat_333830572016-09-02 11:17发表 [回复]
回复chongziyang:你的问题解决了嘛?BH系数如何保证最大的呢?
3楼 a0106552014-08-01 20:20发表 [回复]
请问下载了代码以后为什么报错。
??? Error using ==> imread
File "result100.jpg" does not exist.
你的代码我只变了下图片读取的地址,假如错了,也不该只是result100.jpg错了,其他也会错啊
Re: yaoxingfu722015-07-12 14:19发表 [回复]
回复a010655:image文件夹的路径并没有加上。imread函数搜索不到image文件中。作者并没有加上。matlab程序第59行
解决办法:1.在函数开始的时候把image文件夹路径加上。
2.imread(['./image/',myfile(l).name]);
Re: x3123962962015-11-05 20:22发表 [回复]
回复yaoxingfu72:还是不懂如何实现路径问题。。。
Re: 李木木_Edward2014-11-26 10:42发表 [回复]
回复a010655:我也出了这个问题,请问你解决了没有?
Re: baidu_277489632015-05-04 11:55发表 [回复]
回复李木木_Edward:请问你后来怎么解决的呀= =求指教
Re: sinat_275347372015-05-18 14:06发表 [回复]
回复baidu_27748963:你的解决了吗???我也是同样的问题! 跪求解答!
Re: dan_dan_dan12342015-06-02 21:54发表 [回复]
回复sinat_27534737:我的之前也有这个问题,后来我看到主界面左侧的Current Folder里我使用的图片文件夹是灰色的,我就右键把这个文件夹添加到工作路径中就好了(右键弹出菜单中add to path)
Re: dan_dan_dan12342015-06-02 21:55发表 [回复]
回复sinat_27534737:我的之前也有这个问题,后来我看到主界面左侧的Current Folder里我使用的图片文件夹是灰色的,我就右键把这个文件夹添加到工作路径中就好了(右键弹出菜单中add to path)
Re: dan_dan_dan12342015-06-02 21:54发表 [回复]
回复sinat_27534737:我的之前也有这个问题,后来我看到主界面左侧的Current Folder里我使用的图片文件夹是灰色的,我就右键把这个文件夹添加到工作路径中就好了(右键弹出菜单中add to path)
2楼 新的飞扬2014-07-15 10:13发表 [回复]
请问这里为什么没有乘以g(x)的值呢?谢谢!
xw=xw+w(uint32(q_temp1(i,j))+1)*[i-y(1)-0.5,j-y(2)-0.5];
Re: yangmei36680382014-11-19 19:54发表 [回复]
回复新的飞扬:他的权重是根据到目标中心点的距离算的,没有完全按照这个核函数,但这样是可以的,而且简单。前面已经乘过权重了(直方图的计算时把权重融合进去了),也就是g(x)。
Re: sinat_333830572016-09-02 11:19发表 [回复]
回复yangmei3668038:请问相似度函数最大是怎么体现的呢?
Re: R-e-D2015-07-06 15:04发表 [回复]
回复yangmei3668038:为什么i j要减去0.5啊,望回复。菜鸟一枚!
Re: 愤怒的菜菜鸟2015-08-10 17:18发表 [回复]
回复R-e-D:计算精度问题,浮点运算。
Re: yychenxie212014-09-15 19:49发表 [回复]
g(x)是k(x)倒数的负数,等于常数
Re: han_shan_zi2014-10-20 21:37发表 [回复]
回复yychenxie21:k(x)=C(1-x~2)倒数好像不等于常数啊.

0 0
原创粉丝点击