zoukankan      html  css  js  c++  java
  • 稠密光流

    1 运动场与光流

        当物体与相机存在相对运动时,在视频序列中,物体所成的图像会发生相应的变化。这些变化可以恢复物体与相机间的相对运动,以及物体的形状。

        物体的每一点上的运动速度构成了运动场,物体在图像序列中所表现得明暗变化称为光流,一般情况下,可以使用光流描述物体运动。

     2 光流约束方程

         当图像序列以速度  运动, 时间后运动距离为 ,光流约束方程可表示为:

          是关于 x,y,t 的连续函数,使用泰勒级数对  做一阶近似为:

         带入光流约束方程得:

         两边同时除以  得:

         对于图像上任意点的光流 ,满足以上约束方程,其中, 为图像偏导, 为图像帧间导数。

         从以上方程中可知,需要更多信息来求解图像光流速度。在 LK 光流中,通过建立角点附近的超定方程组来求解光流,这避免了光流求解的孔径问题。在稠密光流中,需要增加附加信息来求解光流。

     3 光流光滑性约束

        在刚体运动中(或类似刚体),一般满足光流速度场是连续变化的。通过最小化 , 使得光流满足连续变化。

        同时,光流约束方程可转化为最小化

        最终,将光流问题转换为最小化 ,其中, 为权重系数,当图像噪声过大使用较小 ,当图像噪声较小时使用较大 

        最小化  可转化为变分问题,下面对离散情形进行讨论:

        对图像上任意点,

        最小化  转换为 ,其中, 为 u, v 的 Laplace 算子的离散形式,

        进一步改写为 

        求解得 

        改写为迭代方法为 

        初始光流为零,通过迭代可逐步求得各点光流速度。对于光滑平面,其光流速度等于其周边平均速度,通过足够的迭代就可以计算每一点的光流速度。

    4 Dual TV-L1 Algorithm

       将函数  改进为  即为 Dual TV-L1 算法。

       opencv 提供了 OpticalFlowDual_TVL1 实现了 Dual TV-L1 Algorithm,其可调节参数包括:

       tau,theta:控制迭代收敛速度,tau 越大或者 theta 越小,迭代速度越快;

       lambda:表示最小化函数中平滑项所占的权重;

       nScales:控制金字塔层数;

       swaps:表示在每层金字塔上,光流速度迭代计算次数;

       epsilon,iterations:控制迭代精度;

       usingInitialFlow:使用初始化光流作为参考估计。

      5 Faerneback Polynomial Expansion Algorithm

         Faerneback 算法使用多项式拟合平面方式评估图像中各个点的运动情况,其拟合平面方程为:

        当图像发生较小平移时,在视频序列中同一点拟合的二次多项式也同样存在一个平移关系:,由于  已知,则可以求解出 

        在一维图像下,拟合前后两帧图像相同位置附近区间的二次曲线,通过模型  可求解偏移量 d。如下图:

          

        下面给出更加详细的解释:

         1)在图像序列中某一点上以一定窗口尺寸拟合二次曲线 ,设两帧间运动距离为 d,使用等式  可得:

              

              ,可求解 

              当拟合趋近越小,更细小的变化可被拟合,当拟合区间越大,更大的变化可被拟合,故需要选择一个合适的拟合区间;

         2)由于在实际拟合中存在噪声干扰,等式  并不一定能够满足,可以通过一些近似方法减少噪声影响,

              令 ,有

         3)如果对图像中每一点计算光流,其噪声很大。假定光流缓慢变化,可以使用区域来降低噪声,

              ,求解线性方程组即可得到更加稳定的光流;

         4)当图像运动过大时,在视频序列同一点上拟合曲线可能无法实现匹配,使用先验知识可以在不同点上进行拟合;

               结合金字塔,可以在较低分辨率上跟踪偏移量,在更高分辨率上使用较低分辨率结果作为初始匹配;

               在最精细分辨率下,使用迭代方式可以更加精确的跟踪光流偏移。

        在 opencv 中,使用 cv::calcOpticalFlowFarneback() 函数实现基于二次多项式拟合的稠密光流计算,其函数原型如下:

        void cv::calcOpticalFlowFarneback(cv::InputArray preImg, cv::InputArray nextImg, cv::InputOutputArray flow,

                                                              double pyrScale, int levels, int winsize, int iterations, int polyN, double polySigma, int flags);

        preImg, nextImg: 传入图像序列中前一帧与后一帧图像,图像格式均为8位单通道,且尺寸应该保持一致。

        flow: 函数记录各点运动向量,图像格式位32位浮点双通道(CV_32FC2),图像尺寸与 preImg, nextImg 保持一致。

        pyrScale: 表示金字塔各层缩减系数,一般使用 .5。

        levels: 表示金字塔层数。

        winsize: 在光流跟踪前,使用 winsize 窗口大小对图像平滑,避免噪声干扰;可将 flags 设置为 cv::OPTFLOW_FARNEBACK_GAUSSIAN 以使用 Gaussian 平滑。

        iterations: 通过控制各层上迭代拟合次数控制跟踪精度。

        polyN: 控制二次多项式拟合区间大小。

        polySigma: polyN = 5, polySigma = 1.1; polyN = 7, polySigma = 1.5。

        flags: 当使用 cv::OPTFLOW_USE_INITIAL_FLOW 时,flow 被同时当作输入参数,表示初始光流速度场;通常在序列视频中,相邻帧运动方向具有相似性,故可以使用上帧速度场作为初始猜测。

      

        参考资料: Learning Opencv 3   Adrian Kaehler & Gary Bradski

                           Robot Vision   Berthold K. P. Horn

                           Determing Optical Flow   Berthold K. P. Horn & Brian G. Schunk

                           Two-Frame Motion Estimation Based On Polynomial Expansion   Gunnar Farneback 

  • 相关阅读:
    CF949C Data Center Maintenance 题解
    P1438 无聊的数列 题解
    CF620E New Year Tree 题解
    结构体优先队列的定义
    CF464E The Classic Problem 题解
    CF427C Checkposts
    CF161D Distance in Tree 题解
    P4375 [USACO18OPEN]Out of Sorts G 题解
    SCI, SCIE, 和ESCI的区别
    Matlab画图中图的方法
  • 原文地址:https://www.cnblogs.com/luofeiju/p/11971181.html
Copyright © 2011-2022 走看看