小伙伴们开始正式玩起了APM的PX4flow,加上课题方向也要用到光流法,因此从哪个角度来说,都是十分必要的。

光流法最常用的是用于机器视觉的跟踪算法,一是可以跟踪目标物体,而是求解目标的运动学参数(平移速度与旋转速度)。

光流法用到了一个很重要的概念,叫做场。图像像素点亮度的变化,形成了与空域有关的一个场,由于云台上的相机是运动的,它取景的位置是与时间有关,这构成了图像的时域。

本科学过热扩散方程,温度场也是一种时空结合的场,热扩散方程的建立的前提是能量守恒定律。如果所研究的温度场与外界绝缘,那么温度场内的热量是守恒的,这样就建立起了一种热扩散方程;如果所研究的温度场受到其他能量的作用,考虑到能量守恒,就能得到广义热扩散方程。

既然光流法研究的也是时空结合的场,要想建立类似的方程,必须做出类似的假设:研究的特征点领域的像素的亮度值在dt时间段前后是恒定的。

提取图像特征点的方法和标准不再本文讨论方法之内,我们主要看光流法方程如何建立的。

某t时刻p特征点图像附近区域的图像记作,其中x,y是相对于p特征点的坐标。过了之后,p特征点在视野中的位置发生了改变,x,y方向的位移为 ,此时时刻为,根据所做的假设,p特征点的领域图像时保持恒定的,那么有

我们倘若在新图像中搜索与原图像亮度值一致的区域,是可以做到的,这就是光流法中的SAD(sum of absolute difference)法,但会遇到一个很可怕的问题,我们不知道这段时间内图像有没有发生旋转,如果发生了旋转,又不知道旋转的方向大小,这个匹配起来太困难了,因为无法确定搜索区域的方向。

当然PX4等飞行器是能解决这个问题的,因为它们配备陀螺仪,能够精确的记录相机坐标系的旋转,矩阵旋转就能得到图像的旋转大小和方向。

图像算法本身能够解决这个问题,这里就要借助数学工具求解出了。

将等式右边用Taylor公式展开,得到

H.O.T.

略去高阶无穷小和利用,有

那么有

这样就能得到相机的平移速度啦!(这个和热扩散方程极像,连思想方法都一样。)

上面提到为某t时刻p特征点图像附近区域的图像,该图像区域里有众多像素,可将光流法方程写的详细点,得到下式:

这里  是该图像区域内的像素点,  为图像  在此时在点领域里的多元函数分别对位置 x, y 和时间 t的偏微分估计。

线性代数这是就派上用场了,上面这么多关系式可以统一写成, 这里

这是一个超定方程,因为未知数只有Vx,Vy两个,而方程个数往往远远多于这些,在矩阵分析中,A矩阵m*n维,且不是方阵,求解V时使用的是A矩阵的伪逆,伪逆的形式有很多种,具体就不展开了。Lucas-Kanade法在这里选取了线性最小二乘法的伪逆。即:线性方程组两边同时乘上A的转置,则

 这样就可以求逆了:
注意:伪逆不是真正的逆,使用上述伪逆求解之后,很可能上述n个等式都不严格相等,而是近似相等,每个等式都存在偏差。线性最小二乘法的伪逆能保证所有的偏差的平方之和最小,这就是最小二乘法的含义。

题外话:wiki百科中一句话真是醍醐灌顶:使用最小二乘法的依据是我们认为偏差e是服从于正态分布,准确的表达式为:。作为一名工科生,做了这么多年实验,当然实验内容有的实在是不敢恭维,但是基本数据处理还是自己做的多,几乎无一例外地使用了最小二乘法(MATLAB拟合工具箱或者是polyfit函数),却不知道这背后的意义。很重要的原因是,概率、统计、随机这一块数学学得少而且抱着得过且过的态度,自然,还包括在之前的文章里提到我对着方面理解能力有限的原因。

这个题外话恰恰从物理原理上揭示了为什么使用线性最小二乘法的伪逆来求解光流速度,因为光流法遇到的噪声多是随机噪声,服从正态分布。

我们还可以从另一个数学问题诉求物理原理,我们知道Taylor展开时近似求导的时候,要求 ,都足够小,这样的近似才更有意义,那么,就要求光流速度足够小,所以Lucas-Kanade法求解光流一个很重要的前提是相邻两帧之间的图像的特征点p的偏移很小,否则求解结果是不准的,这就诞生了许多方法:如金字塔式的LK法,LKT法等等,不再展开

后续(翻阅了刘未鹏和July的博客,终于找到了直线拟合的二乘法解释,参见从决策树学习谈到贝叶斯分类算法、EM、HMM和 数学之美番外篇:平凡而又神奇的贝叶斯方法):

2.4.3、最大似然与最小二乘

学过线性代数的大概都知道经典的最小二乘方法来做线性回归。问题描述是:给定平面上 N 个点,(这里不妨假设我们想用一条直线来拟合这些点——回归可以看作是拟合的特例,即允许误差的拟合),找出一条最佳描述了这些点的直线。

一个接踵而来的问题就是,我们如何定义最佳?我们设每个点的坐标为 (Xi, Yi) 。如果直线为 y = f(x) 。那么 (Xi, Yi) 跟直线对这个点的“预测”:(Xi, f(Xi)) 就相差了一个 ΔYi = |Yi – f(Xi)| 。最小二乘就是说寻找直线使得 (ΔY1)^2 + (ΔY2)^2 + .. (即误差的平方和)最小,至于为什么是误差的平方和而不是误差的绝对值和,统计学上也没有什么好的解释。然而贝叶斯方法却能对此提供一个完美的解释。

我们假设直线对于坐标 Xi 给出的预测 f(Xi) 是最靠谱的预测,所有纵坐标偏离 f(Xi) 的那些数据点都含有噪音,是噪音使得它们偏离了完美的一条直线,一个合理的假设就是偏离路线越远的概率越小,具体小多少,可以用一个正态分布曲线来模拟,这个分布曲线以直线对 Xi 给出的预测 f(Xi) 为中心,实际纵坐标为 Yi 的点 (Xi, Yi) 发生的概率就正比于 EXP[-(ΔYi)^2]。(EXP(..) 代表以常数 e 为底的多少次方)。

现在我们回到问题的贝叶斯方面,我们要想最大化的后验概率是:

P(h|D) ∝ P(h) * P(D|h)

又见贝叶斯!这里 h 就是指一条特定的直线,D 就是指这 N 个数据点。我们需要寻找一条直线 h 使得 P(h) * P(D|h) 最大。很显然,P(h) 这个先验概率是均匀的,因为哪条直线也不比另一条更优越。所以我们只需要看 P(D|h) 这一项,这一项是指这条直线生成这些数据点的概率,刚才说过了,生成数据点 (Xi, Yi) 的概率为 EXP[-(ΔYi)^2] 乘以一个常数。而 P(D|h) = P(d1|h) * P(d2|h) * .. 即假设各个数据点是独立生成的,所以可以把每个概率乘起来。于是生成 N 个数据点的概率为 EXP[-(ΔY1)^2] * EXP[-(ΔY2)^2] * EXP[-(ΔY3)^2] * .. = EXP{-[(ΔY1)^2 + (ΔY2)^2 + (ΔY3)^2 + ..]} 最大化这个概率就是要最小化 (ΔY1)^2 + (ΔY2)^2 + (ΔY3)^2 + .. 。 熟悉这个式子吗?

Lucas Kanade 光流法(来自wiki 百科)相关推荐

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

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

  2. Lucas–Kanade光流算法

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

  3. 分子力场简介 来自wiki百科

    分子力场根据量子力学的波恩-奥本海默近似,一个分子的能量可以近似看作构成分子的各个原子的空间坐标的函数,简单地讲就是分子的能量随分子构型的变化而变化,而描述这种分子能量和分子结构之间关系的就是分子力场 ...

  4. python opencv入门 光流法(41)

    内容来自OpenCV-Python Tutorials 自己翻译整理 目标: 了解光流的概念,使用lucas-kanade估算方法 使用cv2.calcOpticalFlowPyrLK() 方法来追踪 ...

  5. LK金字塔光流法与简单实现

    LK金字塔光流法与简单实现 闲谈时刻 介绍 Lucas–Kanade光流算法 L-K 金字塔光流算法 算法原理 建立金字塔 金字塔迭代 迭代过程 算法流程 算法实现 总结 参考资料 闲谈时刻 不务正业 ...

  6. 【OpenCV 笔记】金字塔光流法追踪运动目标

    原理部分见https://blog.csdn.net/zouxy09/article/details/8683859 环境:OpenCV3.3+VS2017 光流简言之就是像素在某时刻运动的瞬时速度, ...

  7. 光流法 Optical Flow

    最近调研目标跟踪,看到一个光流法,测试了一下它的效果,挺好玩的,这里对找到的资料简单整理总结一下. 对于光流法的介绍,可以参看如下博客http://blog.csdn.net/zouxy09/arti ...

  8. OpenCV3学习(11.2)LK光流法原理及opencv实现

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

  9. Python与OpenCV(三)——基于光流法的运动目标检测程序分析

    光流的概念是指在连续的两帧图像当中,由于图像中的物体移动或者摄像头的移动而使得图像中的目标形成的矢量运动轨迹叫做光流.本质上光流是个向量场,表示了一个像素点从第一帧过渡到第二帧的运动过程,体现该像素点 ...

最新文章

  1. python怎么打开文档_python打开怎么运行
  2. varnish配置详解
  3. 放上了一篇几个月前写的东西
  4. error: Refusing toundefine while domain managed save image exists
  5. UTF8 与 UTF8 +BOM 区别
  6. 2017.8.8 魔兽地图DotR 思考记录
  7. 移动互联网时代,学iOS开发好吗
  8. [转载] 蓝胡子国王的金钥匙
  9. 机器学习基础(五十七)—— 监督学习、无监督学习
  10. notifier chain — 内核通知链【转】
  11. GHOST常用参数详解,让你成为GHOST高手(转)
  12. javassist官方文档翻译
  13. 使用C++对himawari8(9)卫星数据的读取
  14. 【WIN问题】微软Microsoft onenote/store 无法连接网络无法同步解决
  15. 计算机汉字输入发明人王,音形派生键形码计算机汉字输入方法专利_专利查询 - 天眼查...
  16. 计算机自定义桌面设置在哪里设置,如何在windows10桌面设置自定义图片?查看方法...
  17. 雷军—我十年的程序员生涯
  18. MATLAB 设置坐标轴的字体为斜体
  19. 如何检测电脑系统是否为正版系统
  20. Centos搭建配置SDN

热门文章

  1. 五年Java架构师深入剖析微服务架构设计理念与技术体系(值得一看!)
  2. 最短路径算法正确性和操作性闲杂谈-DijkstraFloyd算法
  3. YYModel之字典/Json转模型
  4. Android rom开发:mtk android9.0 开放预置app权限
  5. python打包exe实用工具auto-py-to-exe的操作方法
  6. 初探STM32掉电复位PDR
  7. 请编程实现输出自然数1到1000中含有数字2的数的个数。
  8. USACO-Tea Time
  9. 工厂模式--大侠,您要预定金疮药还是黑玉断续膏?
  10. Linux操作系统 df命令