一、 前言
本篇文章链接:https://zhuanlan.zhihu.com/p/91341439
近年来研究跟踪的方法很多,各种算法几乎层出不齐,主要可将其分为两类目标跟踪算法,一类是传统的目标跟踪算法,一类是基于深度学习的跟踪方法,而基于传统的目标跟踪算法比较经典的有粒子滤波(pf)、Mean Shift目标跟踪算法以及KLT的跟踪算法又或者叫做Lucas光流法,这些方法各有优缺点:
粒子滤波(pf):能够比较好的在全局搜索到最优解,但其求解速度相对较慢,由于其是基于颜色直方图的计算,对颜色相近的物体不太能够区别开来。
Mean Shift算法:很容易陷入局部最优,但其跟踪的速度很快。
基于以上两种算法各自的优缺点,常常有人将Mean Shift和pf做结合,恰好在很多方面能够达到互补的效果。
二、 KLT跟踪算法
Kanade-Lucas-Tomasi方法,在跟踪方面表现的也不错,尤其在实时计算速度上,用它来得到的,是很多点的轨迹“trajectory”,并且还有一些发生了漂移的点,所以,得到跟踪点之后要进行一些后期的处理,说到Kanade-Lucas-Tomasi方法,首先要追溯到Kanade-Lucas两人在上世纪80年代发表的paper:An Iterative Image Registration Technique with an Application to Stereo Vision,这里讲的是一种图像点定位的方法,即图像的局部匹配,将图像匹配问题,从传统的滑动窗口搜索方法变为一个求解偏移量d的过程,后来Jianbo Shi和Carlo Tomasi两人发表了一篇CVPR(94')的文章Good Features To Track,这篇文章,主要就是讲,在求解d的过程中,哪些情况下可以保证一定能够得到d的解,这些情况的点有什么特点(后来会发现,很多时候都是寻找的角点)。
1、具体实现:
(1)几个前提假设:很直观的讲,如果判断一个视频的相邻两帧I、J在某局部窗口w上是一样的,则在窗口w内有:
1)亮度恒定:是为了保证其等号成立不受亮度的影响。这里也可以是从t-1时刻到t时刻,如下所示:
亮度恒等式,时刻亮度与t时刻亮度相等:
2)时间连续或者是运动是“小运动”:为了保证KLT能够找到点
3)空间一致,临近点有相似运动,保持相邻:在同一个窗口中,所有点的偏移量都相等。
假设对像素点来说,周围的像素点都保持相同的移动距离假设窗口大小为
得到下面的过约束等式:
即:
采用最小二乘法求解d:
这样我们就得到了KLT光流等式与该窗口的Hessian矩阵:
2、具体推导过程:
在窗口中,所有
用积分来表示上述式子,以上式子可等效为:
这个式子的含义,即找到两幅图像中,在W窗口中,I,J的差异,这里的w(x)表示权重函数,一般我们可以采用高斯函数进行加权。其中I以
的值为0,由泰勒性质展开:
可以得到:
于是,问题转化为:
其中:
从而,问题即为:
可将上面的等式看作为:
这里,Z为一个2x2的矩阵,e为一个2x1的向量,
为了要使得d能够得到解,则Z需要满足
3、KLT特征跟踪的主要步骤:
1) 用诸如Harris角点的特征检测器在初始帧中寻找一系列特征点;
2) 基于各特征点的局部模板,通过采用平移或仿射运动模型的Lucas-Kanade运动估计,寻找各特征点的帧间对应矢量。
3) 对于各特征点,在各帧中判断其跟踪的好坏。有些特征可以移除(比如去除掉那些被遮挡的或者无法准确跟踪的),可以周期性(如每隔5帧)加入一些新的特征。
三、 基于Opencv代码实现
代码参考:http://cecas.clemson.edu/~stb/klt/
对于下面两幅图像img0.pgm和img1.pgm:
检测Harris角点得到:
KLT跟踪计算得到:
上面分别选取了100个特征点,计算了其所在的位置,最后有55个特征点成功被追踪到。
四、 基于Matlab的人脸检测与KLT特征跟踪
1、基于Matlab的官方自带的人脸检测的代码实列:
主要参考代码:https://ww2.mathworks.cn/help/vision/examples/face-detection-and-tracking-using-the-klt-algorithm.html
然后在框内进行特征点提取。
KLT跟踪:
最后由于我的动作太快,导致了后面的跟踪失败,可见这里体现了前面提到的KLT的假设2:时间连续或者是“小动作”,KLT跟踪局限性还是很大。
2、具体原理步骤实现的代码:
有大神已经在github上上传了相关的代码:https://github.com/yjadaa/KLT,具体实现原理步骤可以参考论文 《good features to track》,效果图附上:
我在基于此上的代码基础上做了修改,通过框选指定矩形内检测最大角点响应点,对该角点进行跟踪,代码我已经上传到github上,
有需要的可自行下载:https://github.com/hli151/Object-Tracking,代码文件描述如下:
代码运行结果如下:
由于本身KLT算法就是很耗时的,所以运行过程中会比较慢,但是能够看到自己修改的代码能有结果也很开森啦,但是到后面不知道出于什么原因,跟踪就不准确,导致跟踪失败,我猜测是不是KLT算法的三个前提假设不满足了呢?或者是有尺度变化导致?(因为KLT算法对目标的跟踪是不具备尺度不变性的),总之,这个算法还是很有局限性的,有待改善!
五、基于QT的代码实现:
也有大神已经在github上上传了相关的代码:https://github.com/search?q=KLT+QT,具体实现的效果图附上:
由效果图我们不难看出,物体的运动速度越慢,所画出来的运动场的矢量对应幅度越短,物体的运动速度越快,所画出来的运动场的矢量对应幅度越长。
主要参考:
1、具体推导过程。https://www.cnblogs.com/moondark/archive/2012/05/12/2497391.html
2、这篇博客很不错哦。
lowkeyway:(三十八)稀疏光流----KLTzhuanlan.zhihu.com五、结束语。
作者人丑勿喷,小菜鸟一枚,欢迎指点,谢谢大家!!!