Target Tracking-MeanShift算法实现流程分析

看了一些博文,但是没有找到能把如何在代码上使用MeanShift实现目标跟踪解析得比较清晰的文章。所以打算根据自己的理解写一篇。

MeanShift算法原理

略,可以自行参考其他博文

MeanShift算法实现目标跟踪流程

  • 初始第一帧

->选定目标模版,即要跟踪的对象

->计算该目标区域的直方图,得到hist1;同时得到该目标区域中心位置的坐标 f1

  • 第二帧

(注意)此时第二帧相比于第一帧中,待跟踪的目标的位置可能已经发生了变化,即产生了移动,所以在第一帧中确定下来的目标中心位置坐标f1此时在第二帧中不再是当前目标的中心位置的坐标了,也就是说之前标定的目标所处位置已经和当前目标实际所处位置存在偏差。

->计算当前搜索窗内图像的直方图,得到hist2;此时搜索窗的中心位置坐标仍是 f1

(解释)搜索窗可理解为在目标跟踪可视化的过程中锁定目标的那个BoundingBox边界框,所以搜索窗实际上表示每一帧以及每一帧内算法认为的当前目标所在的位置,跟踪过程中实际上在移动的也就是搜索窗,所以在算法的角度上看,搜索窗位置和目标位置是一致的;搜索窗大小在MeanShift算法中是不会发生变化的,其与初始帧中选定的目标区域的大小相一致。初始时,搜索窗的中心位置坐标和标定的目标区域中心位置坐标相一致,即在初始帧中,搜索窗和选取的目标区域相一致

->利用某一种相似性度量方式,去衡量hist1和hist2的相似性,由此得到一个权值图wei_map。该权值图wei_map的大小和初始时标定的目标区域的大小、搜索窗的大小相一致;权值图wei_map所在位置与搜索窗位置相一致

(注意)以下过程为MeanShift算法核心的体现

->利用之前计算得到的wei_map,结合搜索窗内

像素点与搜索窗的中心位置的距离,计算出MeanShift向量。这个MeanShift向量表示了当前搜索窗应该移动的方向和大小

->根据计算出的MeanShift向量,更新当前搜索窗的位置,即将当前搜索窗向MeanShift向量的方向移动MeanShift向量的大小。得到更新后的搜索窗中心位置坐标 f2‘

->重复以上四个步骤(计算当前搜索窗的直方图→衡量相似性,更新权值图wei_map→计算MeanShift向量→更新搜索窗位置)直到满足一定的条件后退出循环。这个条件可以是:超出设定的搜索窗的搜索范围h;最近的一次搜索窗口移动的距离小于设定的阈值...

->退出循环后,表示已经找到了第二帧中的目标位置,此时搜索窗中心位置坐标(即跟踪预测的目标所处的中心位置坐标)也已经由上述过程更新为 f2,该坐标也将作为下一帧跟踪过程的搜索窗初始位置坐标;

  • 第三帧

...重复第一帧第二帧过程...延伸到第k和第k+1帧

以上过程用伪代码表示:

hist1[],hist2[],wei_map[],f,MeanShift_vector;    //初始参数的定义
hist1 = cal_hist(f);    //计算得到选定跟踪的目标区域的直方图 

while(!退出跟踪的条件){
    next_frame();    //进入下一帧
    
    while(!退出当前帧中搜索窗位置继续跟踪的条件){        
        hist2 = cal_hist(f)//计算得到当前搜索窗口的直方图hist2;
        wei_map=wei(hist1,hist2);//通过相似性度量得到权值图
        //根据当前搜索窗中心位置坐标,结合搜索窗内像素点与中心位置的距离和权值图wei_map           
        //计算得到MeanShift向量MeanShift_vector;
        MeanShift_vector = cal_MS(f,wei_map);
        f = update_f(f,MeanShift_vector);    //根据MeanShift向量更新搜索窗位置        
    }
}

其中的一些计算过程,包括相似性度量、MeanShift向量的计算可以参考以下内容。以下内容来源于博文:

https://blog.****.net/qq_21033779/article/details/78485195

有个叫什么皮尔逊相关性计算的公式,这里就不在细说。大概的意思是这样的,判断两个图像的相似性,可以通过计算两个图像直方图分布来计算

 

Target Tracking-MeanShift算法实现流程分析

计算box图像与图像块1的相关性,可以得到一个[0,1]之间的数。

Target Tracking-MeanShift算法实现流程分析

这样得到一个相关性图(概率图),每一个像素的值都是[0,1]的小数。再将[0,1]映射到[0,255]就产生一张灰度图了。相关性越高的地方,在灰度图中就越亮。也就是第一张图中的各种点。

下面将计算第一个点是如何迈出它的第一步的:

Target Tracking-MeanShift算法实现流程分析

opencv官方文档中的meanshift迭代过程:

Target Tracking-MeanShift算法实现流程分析