![fb753e75b90e90653fb0fcba114430db.png](https://i-blog.csdnimg.cn/blog_migrate/67df50df0cc2066744575984744e1277.jpeg)
一、 前言
本篇文章链接: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时刻,如下所示:
![da688b78a915e4ec819e2e0f46368f30.png](https://i-blog.csdnimg.cn/blog_migrate/57c26857aedc62dfb42c09b53ae0413b.png)
亮度恒等式,时刻亮度与t时刻亮度相等:
2)时间连续或者是运动是“小运动”:为了保证KLT能够找到点
3)空间一致,临近点有相似运动,保持相邻:在同一个窗口中,所有点的偏移量都相等。
假设对像素点来说,周围的像素点都保持相同的移动距离假设窗口大小为
![bbba1120cda0694fb71efcd6624503f5.png](https://i-blog.csdnimg.cn/blog_migrate/cfa2f8d7867a99bef820a51676e1e84a.png)
得到下面的过约束等式:
![831b7f40ec0d08401a45548635ea6077.png](https://i-blog.csdnimg.cn/blog_migrate/98570f009e46b18784a4153b64a93f16.png)
即:
采用最小二乘法求解d:
![5b96254fad47683a465d0d71498af8b8.png](https://i-blog.csdnimg.cn/blog_migrate/3daea94c5a6136c187b947ff7a9e8337.png)
这样我们就得到了KLT光流等式与该窗口的Hessian矩阵:
![a3084162eaf10ed959636d76c988f621.png](https://i-blog.csdnimg.cn/blog_migrate/8ca98c746f259865a08625fad3e488fb.png)
![0d68d6eb9b300bd27f5b65a9dd58ce14.png](https://i-blog.csdnimg.cn/blog_migrate/2bff4f67a889922b38b448115d3a5aa9.png)
2、具体推导过程:
在窗口中,所有
![e15383aed277246a9e70b59e3447e4c5.png](https://i-blog.csdnimg.cn/blog_migrate/2558a0437406597a790711ae8e88e9a1.png)
用积分来表示上述式子,以上式子可等效为:
![c660d96c977fb06761fa91097560c395.png](https://i-blog.csdnimg.cn/blog_migrate/e0130119cd004e4b2d1fec340f43f777.png)
这个式子的含义,即找到两幅图像中,在W窗口中,I,J的差异,这里的w(x)表示权重函数,一般我们可以采用高斯函数进行加权。其中I以
![ba1c62d81a4707e5bb6dfd8da188f086.png](https://i-blog.csdnimg.cn/blog_migrate/746e8212057d153b52df9211c5165202.png)
的值为0,由泰勒性质展开:
![348217aed61444151af86e2bfeb6f19b.png](https://i-blog.csdnimg.cn/blog_migrate/a20b011588c5c0baf20dacf25eac729f.png)
可以得到:
![2f12df6ef637c1ce8fa2319c8d2c7f58.png](https://i-blog.csdnimg.cn/blog_migrate/91cdefe3b1205e3bf4ba90176e7b3904.png)
于是,问题转化为:
![907f43521861d1029b4ceab00e71701b.png](https://i-blog.csdnimg.cn/blog_migrate/04dbec084febc84a6011f9478d4cd898.png)
其中:
![02fe9757952e98c55ff8fb77a398a4d9.png](https://i-blog.csdnimg.cn/blog_migrate/6cec4a94b0c8738df9b599b07f34f4c9.png)
从而,问题即为:
![9b7206d81ec0e01c70bdb42623c3a615.png](https://i-blog.csdnimg.cn/blog_migrate/a17217408fcd6bf6c04c2c751987a6a9.png)
可将上面的等式看作为:
这里,Z为一个2x2的矩阵,e为一个2x1的向量,
![3c24d80278d551a47da1028d1afa4ed4.png](https://i-blog.csdnimg.cn/blog_migrate/8d15b3fd5eaa35e7f0fddb2a159a4e43.png)
为了要使得d能够得到解,则Z需要满足
3、KLT特征跟踪的主要步骤:
1) 用诸如Harris角点的特征检测器在初始帧中寻找一系列特征点;
2) 基于各特征点的局部模板,通过采用平移或仿射运动模型的Lucas-Kanade运动估计,寻找各特征点的帧间对应矢量。
3) 对于各特征点,在各帧中判断其跟踪的好坏。有些特征可以移除(比如去除掉那些被遮挡的或者无法准确跟踪的),可以周期性(如每隔5帧)加入一些新的特征。
三、 基于Opencv代码实现
代码参考:http://cecas.clemson.edu/~stb/klt/
对于下面两幅图像img0.pgm和img1.pgm:
![62912f3ccedc1c6d2e318644eaa80652.png](https://i-blog.csdnimg.cn/blog_migrate/0d3c48d12d0a64a77c93719f336ac146.png)
![40c1f37a100ae84c5ff4faf20add7516.png](https://i-blog.csdnimg.cn/blog_migrate/6bccf8c3f50f731f2395c84f53de07ef.png)
检测Harris角点得到:
![4672e4f9ea7a10166fe724157ecd36c3.png](https://i-blog.csdnimg.cn/blog_migrate/e521e6218b03330aea8700a85026bdd5.jpeg)
KLT跟踪计算得到:
![fd8f8db08b05ee99ba0937e915ae386a.png](https://i-blog.csdnimg.cn/blog_migrate/60995cb70bba05de407bbceea391beee.png)
![7c5a5bb1e157166e55ef5d505810f81e.png](https://i-blog.csdnimg.cn/blog_migrate/a19d6bc5165fe03e51522058f3e14e77.jpeg)
上面分别选取了100个特征点,计算了其所在的位置,最后有55个特征点成功被追踪到。
四、 基于Matlab的人脸检测与KLT特征跟踪
1、基于Matlab的官方自带的人脸检测的代码实列:
主要参考代码:https://ww2.mathworks.cn/help/vision/examples/face-detection-and-tracking-using-the-klt-algorithm.html
![4ef9b26ef01cf36846133b35fb11b558.png](https://i-blog.csdnimg.cn/blog_migrate/49908a3e23385229afc6a0a7dd649b5e.png)
然后在框内进行特征点提取。
![ba12be395d0e8267535b20949e63a117.png](https://i-blog.csdnimg.cn/blog_migrate/e3f52f040c95cad5f0e17c36d6600af5.png)
KLT跟踪:
![b68b0e0c9069643e5cec9551eb7547a0.png](https://i-blog.csdnimg.cn/blog_migrate/1dc5fecc9109b93ae56fbb8d86b22338.png)
![baf34d64cda8317962a7ea98c176e9ed.png](https://i-blog.csdnimg.cn/blog_migrate/4e5b34e7f55c0e0408c8918748a8b393.png)
![b445e64ca5826297b8405443da74cc3e.png](https://i-blog.csdnimg.cn/blog_migrate/4348ba232c60299fea8c70dbd075810f.png)
![49659a5a5d976b3e0e2bc4216542ba0e.png](https://i-blog.csdnimg.cn/blog_migrate/aeb050c048f59aa6e0e32f44831452af.png)
最后由于我的动作太快,导致了后面的跟踪失败,可见这里体现了前面提到的KLT的假设2:时间连续或者是“小动作”,KLT跟踪局限性还是很大。
2、具体原理步骤实现的代码:
有大神已经在github上上传了相关的代码:https://github.com/yjadaa/KLT,具体实现原理步骤可以参考论文 《good features to track》,效果图附上:
![3e808be5f156413526a93d8378edf6c5.png](https://i-blog.csdnimg.cn/blog_migrate/429c7e63b4a3dffcec5ef9fcfea6fcee.jpeg)
![7746f71c3a5cbf6f48af48c0ce0ea008.png](https://i-blog.csdnimg.cn/blog_migrate/b995438172bc6b9fe985e9119b5c0e16.jpeg)
我在基于此上的代码基础上做了修改,通过框选指定矩形内检测最大角点响应点,对该角点进行跟踪,代码我已经上传到github上,
有需要的可自行下载:https://github.com/hli151/Object-Tracking,代码文件描述如下:
![bd3c83db21f4ce651b6a027ec6598765.png](https://i-blog.csdnimg.cn/blog_migrate/f1cbd8ccce5c16f6868d38448c8f39d0.jpeg)
![9341ff3fe533336fa083da4a390e7d9d.png](https://i-blog.csdnimg.cn/blog_migrate/de34467b8dadf8da6f52aeed57e64637.jpeg)
代码运行结果如下:
![03445fcb83cc58707abcf25c590129a0.png](https://i-blog.csdnimg.cn/blog_migrate/4b16f64f1847e6cd3c0a4e561f953562.jpeg)
![8d950083cdb2213e632628d99c32a7ed.png](https://i-blog.csdnimg.cn/blog_migrate/6ffe242430d974be1da0da8867aaafad.jpeg)
![0a16def17fc47be010d353a81e4826e0.png](https://i-blog.csdnimg.cn/blog_migrate/19044cb5b1901dd3289e6ced5e81a73a.jpeg)
![7057295e89780457a50603f3ad0684e2.png](https://i-blog.csdnimg.cn/blog_migrate/13847b924a0f3df0459daace8172427e.jpeg)
由于本身KLT算法就是很耗时的,所以运行过程中会比较慢,但是能够看到自己修改的代码能有结果也很开森啦,但是到后面不知道出于什么原因,跟踪就不准确,导致跟踪失败,我猜测是不是KLT算法的三个前提假设不满足了呢?或者是有尺度变化导致?(因为KLT算法对目标的跟踪是不具备尺度不变性的),总之,这个算法还是很有局限性的,有待改善!
五、基于QT的代码实现:
也有大神已经在github上上传了相关的代码:https://github.com/search?q=KLT+QT,具体实现的效果图附上:
![c27b2cadda874d7b326cb77ebfaa42f4.png](https://i-blog.csdnimg.cn/blog_migrate/d897ecde2904efdd7f5dc8318c4bbb05.jpeg)
![7e443d93a4a4580ff23ac7659b600115.png](https://i-blog.csdnimg.cn/blog_migrate/e4c6af43c906f343876a51dc321b15b6.jpeg)
由效果图我们不难看出,物体的运动速度越慢,所画出来的运动场的矢量对应幅度越短,物体的运动速度越快,所画出来的运动场的矢量对应幅度越长。
主要参考:
1、具体推导过程。https://www.cnblogs.com/moondark/archive/2012/05/12/2497391.html
2、这篇博客很不错哦。
lowkeyway:(三十八)稀疏光流----KLTzhuanlan.zhihu.com![43d4dce720755aa0bb42c844d826d72f.png](https://i-blog.csdnimg.cn/blog_migrate/7e147d5c20b95783a204de6be9665390.jpeg)
五、结束语。
作者人丑勿喷,小菜鸟一枚,欢迎指点,谢谢大家!!!