Lucas-Kanade 方法

其原论文链接:http://cseweb.ucsd.edu/classes/sp02/cse252/lucaskanade81.pdf

光流法

在目标跟踪的领域引入光流法是一个突破性进展,这还得归功于Barron,他在1994年发布了论文“Performance of optical flow techniques”,并提出了光流这一概念。

虽然这一方法能够对目标更好地进行跟踪,但同时也存在一些限制性因素,包括运动连续性、运动刚性、光的变化、地表实况等。现在大多数的光流算法都是针对全局能量函数的优化问题而提出的,这里的能量函数可以看作为代价函数,它的作用是保持系统状态的稳定。其中它的表达式为:
EGlobal=EData+λEPrior(1)E_{Global} = E_{Data} + \lambda E_{Prior} (1)EGlobal​=EData​+λEPrior​(1)
第一项 EDataE_{Data}EData​ 表示测量光流与输入图像的一致性问题,因为Data中的约束方程小于未知量个数,所以需要一个先验条件来优化该函数,即使用 EPriorE_{Prior}EPrior​ 来表示,并用 λ\lambdaλ 作为系数进行参数调整。


以上是基本的光流约束方程


Lucas-Kanade方法原理

Lucas-Kanade算法是根据两帧图像之间像素点的变化进行处理的,而且具有一定的稀疏性

使用这一方法有几个假设的前提条件,如下所示:

  1. 亮度恒定,从 t 到 t+1 时刻不会出现亮度变化
  2. 运动缓慢,从 t 到 t+1 时刻不会引起位置的剧烈变化
  3. 空间一致,从 t 到 t+1 时刻像素点的邻近点不发生变化
1. 以下是图像匹配时考虑的问题


假设图片的大小为NxN,特征点的大小为MxM

论文中提到了穷举搜索(exhaustively search)进行图像匹配的时间复杂度为 O(M2N2)O(M^2N^2)O(M2N2),消耗太长的时间;也提到了爬山算法(hill-climbing algorithm)是一个局部搜索技术,在一定的情况下无法找到全局最优值,其时间复杂度为O(M2N)O(M^2N)O(M2N);还提到了序惯性检测算法(sequential similarity detection algorithm)中的规则不确定性。

然后提出了自己的方法,先对图 Figure1 中的 h 进行初始估计,再针对每一个像素点使用空间强度梯度(spatial intensity gradient)方法优化 h 值,并使用类似于NR的迭代方法(Newton-Raphson iteration)对该过程进行迭代,该方法的时间复杂度为 O(M2logN)O(M^2 log N)O(M2logN)

2.在简单的一维情况下进行分析

通过分析我们得到了 h 的表达式,然后对 h 的值进行优化


最后我们得到了优化后的 h 表达式,进而求出更加精确的 h 值,以此来获得相同的特征点。然后我们可以从一维扩展到多维,利用同样的方法实现,具体步骤论文中详细介绍了。

将LK方法应用到光流法中可参考链接:https://www.cnblogs.com/gnuhpc/archive/2012/12/04/2802124.html

其中的 I(x,y,t)I(x,y,t)I(x,y,t) 和 I(x+Δx,y+Δy)I(x+ \Delta x,y+ \Delta y)I(x+Δx,y+Δy) 就相当于是前面图中所示的 F(x)F(x)F(x) 和 G(x)G(x)G(x) ,而 h 则相当于转变的方位跟大小,用一阶泰勒展开后的一阶项


在OpenCV中使用LK方法


C++: void calcOpticalFlowPyrLK(InputArray prevImg, InputArray nextImg,InputArray prevPts, InputOutputArray nextPts, OutputArray status, OutputArray err, Size winSize=Size(21,21), int maxLevel=3, TermCriteria criteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01), int flags=0, double minEigThreshold=1e-4 )

第一个参数 prevImg 表示的是8位输入图像 或者是 使用 buildOpticalFlowPyramid() 方法构建的金字塔图像(pyramid)

第二个参数 nextImg 表示的是与 prevImg 同样格式的输入图像,且是对应于 preImg 的下一帧图像

第三个参数 prevPts 表示的是检测到的光流(特征)的二维点向量,其中点坐标必须是单精度浮点数(single-precison floating-point)

第四个参数 nextPts 表示的是一个 包含了在下一帧图像中计算得出的新特征位置 的二维点向量

第五个参数 status 表示的是输出的状态向量,如果能够找到对应特征的流 即将向量元素置为1,若不能则置为0

第六个参数 err 表示的是输出的误差向量,每一个向量相关联的特征点均设置一个误差值,并且误差测量的方式由 参数flags来设定

第七个参数 winSize 表示的是定义的金字塔图像每一层的搜索窗口大小

第八个参数 maxLevel 表示的是定义的金字塔图像的层次,如果 maxLevel=0 即只有一层图像, maxLevel=n 即有n+1层图像。如果金字塔图像被传递给了输入图像,该算法会使用不超过maxLevel的层次数

第九个参数 criteria 表示的是迭代搜索算法 (iterative search algorithm) 的最终收敛条件

第十个参数 flags 表示的是操作标志

  1. OPTFLOW_USE_INITIAL_FLOW
    使用初始估计将特征点(流)储存在 nextPts 上;如果该标志未设置,即将prePts复制到nextPts作为初始的估计值
  2. OPTFLOW_LK_GET_MIN_EIGENVALS
    使用最小特征值 (minimum eigen values) 作为误差度量;如果该标志未设置,即取起始点到运动点之间的L1范数 (L1 norm),然后除以窗口的像素大小作为误差度量

第十一个参数 minEigThreshold 表示的是一个算法,计算2x2标准光流矩阵最小特征值再除以窗口的像素大小;如果求出的值小于minEigThreshold 则过滤掉相应的特征,所以这个方法可以除去不好的特征点并提高性能。

构建金字塔图像的方法


C++: int buildOpticalFlowPyramid(InputArray img, OutputArrayOfArrays pyramid, Size winSize, int maxLevel, bool withDerivatives=true, int pyrBorder=BORDER_REFLECT_101, int derivBorder=BORDER_CONSTANT, bool tryReuseInputImage=true)

第一个参数 img 为8位的输入图像

第二个参数 pyramid 为输出的金字塔图像

第三个参数 winSize 表示的是实现光流算法的窗口大小,不能小于calcOpticalFlowPyrLK() 中的winSize参数。并且它需要计算金字塔层次所需的填充。

第四个参数 maxLevel 表示的是金字塔层次的最大层次数

第五个参数 withDerivatives 表示设置一个预计算梯度处理金字塔图像的每一层图像

第六个参数 pyrBorder 表示的是金字塔图像的边界模式

第七个参数 derivBorder 表示的是梯度的边界模式

第八个参数 tryReuseInputImage 表示的是是否将输入图像的兴趣区域 (ROI : Region of Intretest) 设置到金字塔图像中,默认为 true

进行边界填充是为了避免图像膨胀后导致的边界模糊的状态,填充后才能保证对边界像素的安全操作,以下有两种填充边界(borderType) 的方法

  1. ORDER_CONSTANT: 使用常数填充边界
  2. BORDER_REPLICATE: 复制原图中最临近的行或者列

该函数返回一个int型数据,表示金字塔图像的层次大小,不过该值小于 maxLevel


Lucas-Kanade算法相关推荐

  1. Lucas–Kanade算法

     本文转自:http://blog.csdn.net/JustRemind/article/details/23745579 原文地址:http://www.cnblogs.com/gnuhpc/ ...

  2. 【算法分析】Lucas–Kanade光流算法

    (最近再看光流法的应用,发现一篇对算法讲的非常好的文章,转载过来看) 转自:gnuhpc的百草园和三味书屋 作者:gnuhpc@gmail.com 简介:在计算机视觉中,Lucas–Kanade光流算 ...

  3. 详解OpenCV中的Lucas Kanade稀疏光流单应追踪器

    详解OpenCV中的Lucas Kanade稀疏光流单应追踪器 1. 效果图 2. 源码 参考 这篇博客将详细介绍OpenCV中的Lucas Kanade稀疏光流单应追踪器. 光流是由物体或相机的运动 ...

  4. Lucas–Kanade

    博主声明:本文英文内容全部来自于http://en.wikipedia.org/wiki/Lucas_Kanade_method,中文由博主据此进行翻译而来. 在计算机视觉中,Lucas-Kanade ...

  5. Lucas–Kanade光流算法

    1. 光流的概念 •空间运动物体在观察成像平面上的像素运动的瞬时速度 2. 光流法的原理 •利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相 ...

  6. Lucas Kanade 光流法(来自wiki 百科)

    小伙伴们开始正式玩起了APM的PX4flow,加上课题方向也要用到光流法,因此从哪个角度来说,都是十分必要的. 光流法最常用的是用于机器视觉的跟踪算法,一是可以跟踪目标物体,而是求解目标的运动学参数( ...

  7. 光流的计算(Lucas–Kanade method)

    Lucas-Kanade 方法假设光流在一个较小的局部区域内是保持不变的,然后采用最小二乘的方法来计算每一个点的光流. 对于每一个像素点,其光流(速度)可以这样表示: 对于这个表示,我们可以这样理解: ...

  8. 光流(二)--光流算法

    原文: http://www.cnblogs.com/gnuhpc/archive/2012/12/04/2802124.html 简介:在计算机视觉中,Lucas–Kanade光流算法是一种两帧差分 ...

  9. 基于Lucas-Kanade算法的三维光流提取matlab仿真

    目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 光流的概念:(Optical flow or optic flow)        它是一种运动模式 ...

  10. Lucas-Kanade光流算法原理

    光流(Optical flow or optic flow) 它是一种运动模式,这种运动模式指的是一个物体.表面.边缘在一个视角下由一个观察者(比如眼睛.摄像头等)和背景之间形成的明显移动. 光流技术 ...

最新文章

  1. java 双调旅行商 hamiltonian,双调欧几里得旅行商问题(TSP)
  2. 记 Arthas 实现一次 CPU 排查与代码热更新
  3. Oralce删除多个表
  4. 客户跟进节奏(转至索菲外贸日记)
  5. Linux学习:文件描述符表
  6. Java黑皮书课后题第10章:**10.23(实现String类)在Java库中提供了String类,给出你自己对下面方法的实现(将新类命名为MyString2)
  7. Docker 实战教程之从入门到提高(二)
  8. 根据作用C语言关键字分为,C语言 关键字
  9. 终于有人将进程间通信讲明白了
  10. MySQL 无符号和有符号的区别
  11. Doldrums:功能强大的逆向工程分析工具
  12. u盘修复计算机系统,U盘启动盘修复win10系统的详细步骤
  13. cesium 设置飞机的heading pitch roll(航向等)
  14. python递归解压文件_Python之路10-递归调用解压zip包或rar包
  15. Linux如何访问网络 - 管理Linux的联网
  16. xshell6个人版解除窗口限制(亲测可用,需卸载当前xshell6)
  17. 人工蜂群算法python_python实现人工蜂群算法
  18. pandas 中.dropna()的用法
  19. 折半查找法(二分搜索法)
  20. centos5安装nagios

热门文章

  1. linux 笔记本双显示器,Ubuntu设置笔记本电脑双显示器(linux)
  2. jquery的图片播放插件 - colorbox
  3. 利用PIN码破解wifi密码(WPA2-PSK)
  4. 触发器引起的删除对象报错ORA-00604 ORA-20001的排查
  5. Java软件工程师面试常见问题集锦之一
  6. 安装错误 Package requirements (json-c) were not met: No package ‘json-c‘ found
  7. CentOS安装配置freeIPA
  8. EL表达式获取属性时所做的事情~
  9. 女孩起名取名字:聪明美丽、好听委婉的女孩名字
  10. Pandas常用函数大合集