meanshift运动跟踪算法详解

来源:互联网 发布:知乎寒武纪芯片 编辑:程序博客网 时间:2024/05/22 01:54
<div id="article_content" class="article_content tracking-ad" data-mod="popu_307" data-dsm="post">


<p><span style="white-space:pre"></span>这几天学习《学习<a href="http://lib.csdn.net/base/opencv" class="replace_word" title="OpenCV知识库" target="_blank" style="color:#df3434; font-weight:bold;">OpenCV</a>》中的第十章运动跟踪,里面讲到了meanshift<a href="http://lib.csdn.net/base/datastructure" class="replace_word" title="算法与数据结构知识库" target="_blank" style="color:#df3434; font-weight:bold;">算法</a>,根据书上所讲实在难以理解,meanshift在运动跟踪这个过程中到底起到什么作用,于是经过几天不断地看相关资料和别人的博客文章,慢慢思路清晰了,也终于知道了meanshift这个算法它到底是什么作用,起到什么样的角色,虽然为了弄明白这个算法花了几天的时间,但是通过这个过程学到了很多其他的知识。好了,接下来进入正题。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先要介绍一下meanshift这个算法,它的本质是一个迭代的过程,那么这个算法的最终效果是什么呢?或者说这个算法能做什么事情?它能够在一组数据的密度分布中寻找到局部极值,它比较稳定,而且是无参密度估计(它不需要事先知道样本数据的概率密度分布函数,完全依靠对样本点的计算),而且它在采样充分的情况下,一定会收敛,即可以对服从任意分布的数据进行密度估计。下面来根据几张图片来理解一下meanshift算法的最终效果:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里就不把meanshift的数学公式什么的都写出来了,只为了让大家知道meanshift是什么作用;高维的我们也先不考虑,以二维来说明可能更容易理解,下图中的很多的红点就是我们的样本特征点,meanshift就是在这些点中的任意一个点为圆心,然后以半径R画一个圆(在<a href="http://lib.csdn.net/base/opencv" class="replace_word" title="OpenCV知识库" target="_blank" style="color:#df3434; font-weight:bold;">opencv</a>中是一个矩形),然后落在这个圆中的所有点和圆心都会对应的一个向量,把所有这些向量相加(注意是向量相加),最终我们只得到一个向量,就是下图中用黄色箭头表示的向量,这个向量就是meanshift向量。</p>
<p>&nbsp;<img src="http://img.blog.csdn.net/20160327155841152?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后再以这个meanshift向量的终点为圆心,继续上述过程,又可以得到一个meanshift向量,如下图:</p>
<p>&nbsp;<img src="http://img.blog.csdn.net/20160327155919105?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后不断地继续这样的过程,我们可以得到很多连续的meanshift向量,这些向量首尾相连,最终得到会在一个地方停下来(即我们说的meanshift算法会收敛),最后的那个meanshift向量的终点就是最终得到的结果(一个点),如下图:</p>
<p>&nbsp;<img src="http://img.blog.csdn.net/20160327155933543?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从上述的过程我们可以看出,meanshift算法的过程最终的效果就是:从起点开始,最终会一步一步到达样本特征点最密集的点那里(当然在哪个点就是终点这个要取决于我们设定的阈值)。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注:如果还是不明白为什么会向密集的地方走去,可以利用向量的加法规则自己画个简单的图去理解一下。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 到这里可能只知道meanshift算法的作用是向数据密集的地方走的一个效果,但是还是不明白它是怎么在运动跟踪中发挥作用的,尤其是不理解它这个样本特征点(就是上图中的红点点)到底和我们图像中的什么对应的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于上面这个问题,我们需要先了解一下运动跟踪算法是一个什么样的过程,知道了这个过程之后就可以知道meanshift算法在这个过程中发挥什么角色了。运动跟踪说到底就是在一开始告诉程序一个跟踪目标,即我想跟踪什么,然后程序就在接下来的视频帧中去寻找这个目标了。给定跟踪目标很简单,直接在图像中给一个ROI给程序就可以了,那么程序接下来要做的就是在下一帧图像中去找这个ROI,但这个ROI是移动了的,已经不在之前的那个位置了,那么这个时候程序要怎么来找到这个ROI呢?那么在<a href="http://lib.csdn.net/base/computervison" class="replace_word" title="计算机视觉知识库" target="_blank" style="color:#df3434; font-weight:bold;">计算机视觉</a>中我们是这么来解决的:首先对跟踪目标进行描述,这个描述是将跟踪目标区域转换为颜色HSV空间,然后得到H的这个通道的分布直方图,有了这个描述之后,我们就是要在下一个视频帧中找到和这个描述的一样的区域,但是我们知道要找到完全一样的区域很难,所以我们就用了一个相似函数来衡量我们找到的区域和我们的目标区域的相似度,通过这个相似函数,相似函数值越大说明我们找打的区域和目标区域越相似,所以我们的目标就是要找这个对应最大相似值的区域,那么怎么来找呢?这个时候meanshift就排上用场了,它可以通过不断地迭代得到有最大相似值的区域(具体里面的是怎么算的,可以参考博文地底下的参考博客),meanshift的作用可以让我们的搜索窗口不断向两个模型相比颜色变化最大的方向不断移动,直到最后两次移动距离小于阈值,即找到当前帧的位置,并以此作为下一帧的起始搜索窗口中心,如此重复,这个过程每两帧之间都会产生一个meanshift向量,整个过程的meanshift向量连起来就是目标的运动路径。所以讲到这里了,我们已经知道了meanshift算法在整个运动跟踪过程中扮演什么角色了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 整个运动跟踪过程就是如下图所示:</p>
<p>&nbsp;<img src="http://img.blog.csdn.net/20160327155946637?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""></p>
<p>参考博客:</p>
<p>http://blog.csdn<a href="http://lib.csdn.net/base/dotnet" class="replace_word" title=".NET知识库" target="_blank" style="color:#df3434; font-weight:bold;">.NET</a>/jinshengtao/article/details/30258833</p>
<p>http://www.cnblogs.com/liqizhou/archive/2012/05/12/2497220.html</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</p>
   
</div>
原创粉丝点击