一、 前言

本篇文章链接: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)空间一致,临近点有相似运动,保持相邻:在同一个窗口中,所有点的偏移量都相等。

假设对像素点来说,周围的像素点都保持相同的移动距离假设窗口大小为

,则对于25个窗口内的像素点来说,就会如下等式成立:

得到下面的过约束等式:

即:

采用最小二乘法求解d:

这样我们就得到了KLT光流等式与该窗口的Hessian矩阵:

2、具体推导过程:

在窗口中,所有

都往一个方向移动了
,从而得到
,即t时刻的
点在
时刻为
,所以寻求匹配的问题可化为对以下的式子寻求最小值,或者叫做最小化以下式子:

用积分来表示上述式子,以上式子可等效为:

这个式子的含义,即找到两幅图像中,在W窗口中,I,J的差异,这里的w(x)表示权重函数,一般我们可以采用高斯函数进行加权。其中I以

为中心,J以
为中心,
为半径的一个矩形窗口间的差异,结合微积分的知识,函数
要取得最小值,这个极值点的导数一定为0,即:

的值为0,由泰勒性质展开:

可以得到:

于是,问题转化为:

其中:

从而,问题即为:

可将上面的等式看作为:

这里,Z为一个2x2的矩阵e为一个2x1的向量,

为了要使得d能够得到解,则Z需要满足

的矩阵可逆,其中
为Z的转置,而在一般情况下,恰好角点有这样的特点,由此我们可以进一步对KLT算法理解,KLT算法就是在给定的图像上遍历寻找出特征点,也就是角点,常用Harris角点,然后与被给定的目标模板,即跟踪目标的特征点对准之后计算增量平移的一个迭代计算,来实现跟踪,也可以认为是,图像配准之后计算仿射变换参数实现目标迭代跟踪。

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:(三十八)稀疏光流----KLT​zhuanlan.zhihu.com

五、结束语。

作者人丑勿喷,小菜鸟一枚,欢迎指点,谢谢大家!!!

matlab 高斯迭代代码_KLT目标跟踪学习与代码实现相关推荐

  1. opencv动态目标跟踪学习总结

    用opencv实现对视频中动态目标的追踪 第一步,是要建立一个编程环境,然后加载opencv的库路径等等.具体步骤在 http://www.opencv.org.cn/ 的"安装" ...

  2. Jarry的目标跟踪学习笔记一

    Jarry的目标跟踪学习笔记一 目标跟踪是计算机视觉中的一个重要方向,已经由来已久,并且有着广泛的应用,如:视频监控,人机交互, 无人驾驶等.在我的想象中,自己研究的内容就是,将来钢铁侠头盔里追踪敌人 ...

  3. Py之pygame:有趣好玩—利用pygame库实现鱼儿自动实时目标跟踪(附完整代码)

    Py之pygame:有趣好玩-利用pygame库实现鱼儿自动实时目标跟踪(附完整代码) 目录 输出结果 实现代码 输出结果 实现代码 #Py之pygame:利用pygame库实现鱼儿自动实时目标跟踪i ...

  4. c++代码好玩_Py之pygame:有趣好玩—利用pygame库实现鱼儿自动实时目标跟踪(附完整代码)...

    Py之pygame:有趣好玩-利用pygame库实现鱼儿自动实时目标跟踪(附完整代码) 目录 输出结果 实现代码 输出结果 ​ 实现代码 #Py之pygame:利用pygame库实现鱼儿自动实时目标跟 ...

  5. 目标跟踪学习算法DSST

    原文:http://blog.csdn.net/gxb0505/article/details/52601613?locationNum=8 简介(Accurate Scale Estimation ...

  6. 目标跟踪学习笔记_2(particle filter初探1)

    首先提供几篇关于粒子滤波算法的博客: http://www.cnblogs.com/yangyangcv/archive/2010/05/23/1742263.html 这篇博客比较通俗易懂,简单的介 ...

  7. Staple目标跟踪算法C++代码测试

    一.介绍 Staple综合了局部特征HOG和全局特征颜色直方图用于目标跟踪的算法. 首先作者发现颜色分布不足以将目标和背景区分开来.局部特征这样的模板在应对剧烈形变的时候效果往往很差. 作者针对这两个 ...

  8. 更深更宽的孪生网络,有效提升目标跟踪精度,代码开源

    点击我爱计算机视觉标星,更快获取CVML新技术 本文为52CV群友Mr.Chen投稿,深入解读了CVPR 2019 跟踪方向的论文Deeper and Wider Siamese Networks f ...

  9. 目标跟踪学习笔记_1(opencv中meanshift和camshift例子的应用)

    在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行op ...

最新文章

  1. SAP MM 采购附加费在收货以及发票过账时候的会计分录
  2. 笔记-项目质量管理-质量保证和质量控制
  3. 2021牛客多校5 - Double Strings(dp+组合数学)
  4. django+celery+rabitmq
  5. 大数据 数据库 评测_为什么腾讯QQ的大数据平台选择了这款数据库?
  6. 玩转spring boot——开篇
  7. Java 集合处理/ 空值处理/ 异常处理,使用心得分享!
  8. Arduino温控风扇
  9. 最全编程开发常用单词词汇
  10. Phyton学习笔记
  11. 网络诊断提示:远程计算机或设备将不接受连接 (根治 )
  12. vue 二级路由嵌套和二级路由高亮问题
  13. UE_材质_UV计算相关
  14. linux查询日志命令加过滤,日志查看技巧之筛选[linux命令集][排查篇]
  15. Hive On Spark
  16. PBC Library Manual(PBC库手册)翻译(一)
  17. ARM-CPU工作原理,基于ARM的SOC讲解
  18. react中findDOMNode
  19. geo mysql_GEO数据库及应用场景介绍
  20. Java: 生成plist文件

热门文章

  1. 1.让博客被搜索引擎检索到
  2. 文档已无水印,苹果手机看word有水印
  3. 处理使用node-gpy时遇到的Can't find msbuild.exe错误
  4. 安卓学习日记(一):了解安卓架构(linux内核层、系统运行库层、应用框架层、应用层)
  5. sqlserver200864位下载_SQL Server 2008 SP3
  6. [SPC]生产统计过程控制一
  7. 机器学习中的常见问题——K-Means算法与矩阵分解的等价
  8. 同态加密GSW方案学习笔记1-GSW最初方案概述
  9. python 苹果 劣势_Mac与Windows各自的优势是什么?
  10. Arduino直接控制遥控汽车