近来在研究跟踪,跟踪的方法其实有很多,如粒子滤波(pf)、meanshift跟踪,以及KLT跟踪或叫Lucas光流法,这些方法各自有各自的有点,对于粒子滤波而言,它能够比较好的在全局搜索到最优解,但其求解速度相对较慢,由于其是基于颜色直方图的计算,所以对相同颜色东西不太能够区别,meanshift方法很容易陷入局部最优,但速度还是挺快,所以现在很有一些人是将meanshift跟pf结合做跟踪,恰好在很多方面能够互补。

  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的解,这些情况的点有什么特点(后来会发现,很多时候都是寻找的角点)。

  PS: 其实我很奇怪这个算法为什么叫做KLT算法,而不加上Jianbo Shi的名字~

  好吧,前戏就这么多,接下来进入正题,KLT是如何实现跟踪的?

  先说KLT算法的几个前提假设:
   1)亮度恒定
   2)时间连续或者是运动是“小运动”
     3)空间一致,临近点有相似运动,保持相邻

  这几个为什么要这么假设,我在后面来解释,很直观的讲,如果判断一个视频的相邻两帧I、J在某局部窗口w上是一样的,则在窗口w内有:I(x, y, t) = J(x', y', t+τ),亮度恒定的假设(假设1)即为了保证其等号成立不受亮度的影响,假设2是为了保证KLT能够找到点,假设3则为以下原因假设(即对于同一个窗口中,所有点的偏移量都相等):

  在窗口w上,所有(x, y)都往一个方向移动了(dx,  dy),从而得到(x', y'),即t时刻的(x, y)点在t+τ时刻为(x+dx, y+dy),所以寻求匹配的问题可化为对以下的式子寻求最小值,或叫做最小化以下式子:

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

  这个式子的含义,即找到两副图像中,在W窗口中,I、J的差异,其中I以x-d/2为中心,J以x+d/2为中心,w/2为半径的一个矩形窗口间的差异,好吧,结合我们微积分的知识,函数ε(d)要取得最小值,这个极值点的导数一定为0,即
  

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

可以得到:

于是,问题转化为:

其中:

从而,问题即为:

=>

即其等式可看作为:

其中,Z为一个2*2的矩阵,e为一个2*1的向量,

为了要使d能够得到解,则Z需要满足条件,即Z*Z'矩阵可逆,其中Z'为Z矩阵的转置(ZT),在一般情况下,角点具有这样的特点。

在OpenCV里面,找角点的函数可用

void cvGoodFeaturesToTrack(
const CvArr* image
CvArr* eigImage, CvArr* tempImage
CvPoint2D32f* corners
int* cornerCount
double qualityLevel
double minDistance
const CvArr* mask=NULL
int blockSize=3
int useHarris=0 //一般采用Harris角点
double k=0.04 );

然后可以通过函数cvCalcOpticalFlowPyrLK进行跟踪(好像OpenCV里面调用LK的函数不止这一个,这个是金字塔计算):

void cvCalcOpticalFlowPyrLK(
const CvArr* prev,
const CvArr* curr,
CvArr* prevPyr,
CvArr* currPyr,
const CvPoint2D32f* prevFeatures,
CvPoint2D32f* currFeatures,
int count,
CvSize winSize,
int level,
char* status,
float* track error,
CvTermCriteria criteria,
int flags );

  OK,KLT算法的原理基本就这样,其实其跟踪效果并非太准,后来有很多提出的校正的方法,其中我目前看到比较实用的就是TLD算法的作者Zdenek Kalal在他2010年ICPR上的文章Forward-Backward Error: Automatic Detection of Tracking Failures提出的方法看起来非常不错,我正动手实现之。

网友做过的实验用光流+角点检测效果图:

用角点统计光流1

opencv 中d1-2:

opencv 中的cif-3:

fast 角点-4:

用gmm:

http://www.cnblogs.com/moondark/archive/2012/05/12/2497391.html

http://blog.sina.com.cn/s/blog_50363a7901011215.html

http://www.cnblogs.com/jtianwen2014/p/4249003.html knn分类

目标跟踪之klt---光流跟踪法的更多相关文章

  1. 目标跟踪之Lukas-Kanade光流法

    转载自:http://blog.csdn.net/u014568921/article/details/46638557 光流是图像亮度的运动信息描述.光流法计算最初是由Horn和Schunck于19 ...

  2. 目标跟踪之Lukas-Kanade光流法(转)

    光流是图像亮度的运动信息描述.光流法计算最初是由Horn和Schunck于1981年提出的,创造性地将二维速度场与灰度相联系,引入光流约束方程,得到光流计算的基本算法.光流计算基于物体移动的光学特性提 ...

  3. 【监控实践】【4.1】利用trace实现阻塞跟踪和慢查询跟踪

    原文:https://blog.csdn.net/kk185800961/article/details/49252037 分享个SQLServer profiler 的一个技巧吧.很早用过,忘记总结 ...

  4. KLT 光流

    一 光流 光流的概念是Gibson在1950年首先提出来的.它是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在 ...

  5. 服务跟踪sleuth和可视化跟踪工具Zipkin

    一.增加配置 在Order工程中添加配置 <dependency> <groupId>org.springframework.cloud</groupId> < ...

  6. git忽略未被跟踪和已被跟踪的文件

    git的文件操作本质上来讲是基于文件索引来做追踪的.   至于忽略未跟踪(untrack)文件文件,git提供了三种方式 1 .gitignore 2 git config --global core ...

  7. oracle行跟踪(基于行跟踪的ROWDEPENDENCIES ORA_ROWSCN信息)

    在Oracle 10g中的引入了ORA_ROWSCN伪列新特性.基于此种伪列所提供的信息,我们可以方便地找出某个数据块或某一个行最近被修改的时间戳.在默认情况下,10g下表会以非行依赖性(NOROWD ...

  8. 由于内部错误,服务器无法处理该请求。有关该错误的详细信息,请打开服务器上的 IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribute 或从 <serviceDebug> 配置行为)以便将异常信息发送回客户端,或打开对每个 Microsoft .NET Framework SDK 文档的跟踪并检查服务器跟踪日志。

    客户端调用WCF的时候报上面的错误,WCF只能序列化基础的数据类型,不能直接序列化SqlParameter类型,需要使用自定义类,然后在WCF服务端转换的方式解决: 自定义类代码如下: using S ...

  9. pl-svo代码解读

    pl-svo是在svo的基础上结合点和线特征的半直接法视觉里程计 程序启动通过app文件夹下的run_pipeline.cpp主程序启动,其它的函数文件统一放在src文件夹下,我们先从run_pipe ...

随机推荐

  1. Remote procedure call (RPC)

    Remote procedure call (RPC) (using the .NET client) Prerequisites This tutorial assumes RabbitMQ isi ...

  2. Editplus格式化代码

    Editplus格式化代码插件(CSS,JS)今天在BlueIdea看到有人发了一篇名 为“让Editplus自动格式化css和js”的文章,看完后觉得写的很好,我也突然来了灵感,为什么不把前端开发常 ...

  3. git rebase、git merge、git cherry-pick 使用详解

    1.git cherry-pick 是合入其他分支的某一次或者几次提交(cherry-pick是挑选的意思):把其他分支的某些功能合入当前分支 2.git merge 把其他分支合入当前分支,一般用作 ...

  4. Nginx 报错413 Request Entity Too Large 上传文件过大

    1.进入Nginx安装路径下的conf文件夹中(我的路径是:/usr/local/nginx/conf) 2.打开nginx.conf,在http大括号中第一行加语句:client_max_body_ ...

  5. Extjs grid 遍历store

    var projectMemberGrid = Ext.getCmp("projectMemberGrid"); var selFuns = []; projectMemberGr ...

  6. 使用Vmware虚拟机部署Swift开发环境之Mac OSX系统安装

    一.使用VMware虚拟机部署Swift开发环境所需工具: Vmware Workstation 10.0虚拟机软件VM安装Mac解锁工具Unlock苹果操作系统(Mac OS X Mavericks ...

  7. JsonFX 序列化反序列化

    /// <summary> /// Json 序列化工具类 /// </summary> public class SerializeJsonUtility { /// < ...

  8. Linux——CentOS 6.3下PostgreSQL 的安装与配置

    一.简介 PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS),也是目前功能最强大,特性最丰富和最复杂的自由软件数据库系统.有些特性甚至连商业数据库 都不具备.这个起源于伯 ...

  9. mysqli 预处理语句

    预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高. <?php // 设置编码格式 header('content-type:text/html;charset=utf-8'); / ...

  10. iOS 物流信息时间轴

    代码地址如下:http://www.demodashi.com/demo/11958.html timelineLogistics 是模仿淘宝物流信息时间轴界面的自定义View 准备工作 引入Maso ...