zoukankan      html  css  js  c++  java
  • 跟踪运动目标

    视频序列显示的是运动中的场景和物体,非常有趣。上一章介绍了读取、处理和存储视频的
    工具,本章将介绍几种跟踪图像序列中运动物体的算法。之所以能产生这种可见运动或表观运动,
    是因为物体以不同的速度在不同的方向上移动,或者是因为相机在移动(或者两者都有)
    在很多应用程序中,跟踪表观运动都是极其重要的。它可用来追踪运动中的物体,以测定它
    们的速度、判断它们的目的地。对于手持摄像机拍摄的视频,可以用这种方法消除抖动或减小抖
    动幅度,使视频更加平稳。运动估值还可用于视频编码,用以压缩视频,便于传输和存储。本章
    将介绍几种在图像序列中跟踪运动物体的算法,被跟踪的运动可以是稀疏的(图像的少数位置上
    有运动,称为稀疏运动),也可以是稠密的(图像的每个像素都有运动,称为稠密运动)
    跟踪视频中的特征点
    从前面章节介绍的内容可以看出,根据特殊的点分析图像,可以使计算机视觉算法更加实
    高效。对于图像序列也是如此,通过分析特征点的运动,可以判断场景中各种物体的运动情况
    节将通过跟踪在多个帧之间移动的特征点,对图像序列进行时序分析。

    实现原理

    要逐帧地跟踪特征点,就必须在后续帧中定位特征点的新位置。假设每个帧中特征点的强度
    值是不变的,这个过程就是寻找如下的位移(u,v):
    in(x,y)=(in+1(x+u,y+v)
    其中in和in+1分别是当前帧和下一个瞬间的帧。强度值不变的假设普遍适用于相邻图像上的
    微小位移。我们可使用泰勒展开式得到近似方程式(包含图像导数)
    Lt+1(x+u,y+v)≈it(x,y)+泰勒展开
    根据第二个方程式,可以得到另一个方程式(根据强度值不变的假设,去掉了两个表示强度
    值的项)


    这就是基本的光流约束方程,也称作亮度恒定方程。
    Lukas- Kanade特征跟踪算法使用了这个约束方程。除此之外,该算法还做了一个假设,即
    特征点邻域中所有点的位移量是相等的。因此,我们可以将光流约束应用到所有位移量为(u,y
    的点(u和v还是未知的)。这样就得到了更多的方程式,数量超过未知数的个数(两个,因此
    可以在均方意义下解出这个方程组。在实际应用中,我们采用迭代的方法来求解。为了使搜索更
    高效且适应更大的位移量, OpenCV还提供了在不同分辨率下进行计算的方法。默认的图像等级
    数量为3,窗口大小为15;当然,这些参数是可以修改的。你还可以设定一个终止条件,符合这
    个条件时就停止迭代搜索。cv:: calcopticalF1 owPyrLK函数的第六个参数是剩余均方误差,
    用于评定跟踪的质量。第五个参数包含二值标志,表示是否成功跟踪了对应的点。
    这些就是 Lukas- Kanade跟踪算法的基本规则。具体实现时还做了优化和改进,使该算法在
    计算大量特征点的位移时更加高效。

     

    void cv::calcOpticalFlowPyrLK    (    
    InputArray     prevImg,//buildOpticalFlowPyramid构造的第一个8位输入图像或金字塔。
    InputArray     nextImg,//与prevImg相同大小和相同类型的第二个输入图像或金字塔
    InputArray     prevPts,//需要找到流的2D点的矢量(vector of 2D points for which the flow needs to be found;);点坐标必须是单精度浮点数。
    InputOutputArray     nextPts,//输出二维点的矢量(具有单精度浮点坐标),包含第二图像中输入特征的计算新位置;当传递OPTFLOW_USE_INITIAL_FLOW标志时,向量必须与输入中的大小相同。
    OutputArray     status,//输出状态向量(无符号字符);如果找到相应特征的流,则向量的每个元素设置为1,否则设置为0。
    OutputArray     err,//输出错误的矢量; 向量的每个元素都设置为相应特征的错误,错误度量的类型可以在flags参数中设置; 如果未找到流,则未定义错误(使用status参数查找此类情况)。
    Size     winSize = Size(21, 21),//每个金字塔等级的搜索窗口的winSize大小。
    int     maxLevel = 3,//基于0的最大金字塔等级数;如果设置为0,则不使用金字塔(单级),如果设置为1,则使用两个级别,依此类推;如果将金字塔传递给输入,那么算法将使用与金字塔一样多的级别,但不超过maxLevel。
    TermCriteria     criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01),//参数,指定迭代搜索算法的终止条件(在指定的最大迭代次数criteria.maxCount之后或当搜索窗口移动小于criteria.epsilon时)。
    
    
    
    int     flags = 0,//flags :操作标志:
    OPTFLOW_USE_INITIAL_FLOW使用初始估计,存储在nextPts中;如果未设置标志,则将prevPts复制到nextPts并将其视为初始估计。
    OPTFLOW_LK_GET_MIN_EIGENVALS使用最小特征值作为误差测量(参见minEigThreshold描述);如果没有设置标志,则将原稿周围的色块和移动点之间的L1距离除以窗口中的像素数,用作误差测量。
    double     minEigThreshold = 1e-4 //算法计算光流方程的2x2正常矩阵的最小特征值,除以窗口中的像素数;如果此值小于minEigThreshold,则过滤掉相应的功能并且不处理其流程,因此它允许删除坏点并获得性能提升。
    )        

    对 TermCriteria的解释:Opencv里面的TermCriteria对象解释_虾米ning的博客-CSDN博客

    lucas——kanade特征跟踪算法

    1.亮度恒定,即图像场景中目标的像素在帧间运动时外观上保持不变;
    2.时间连续或者运动是”小运动“,即图像的运动随时间的变化比较缓慢;
    3.空间一致,即一个场景中同一表面上邻近的点具有相似的运动。然而,对于大多数30HZ的摄像机,大而连贯的运动是普遍存在的情况,所以LK光流正因为这个原因在实际中的跟踪效果并不是很好。我们需要大的窗口来捕获大的运动,而大窗口往往违背运动连贯的假设!而图像金字塔可以解决这个问题,于是乎,金字塔Lucas-Kanade就提出来了。
    详细讲解:opencv中CalcOpticalFlowPyrLK实现的光流法理解_AP1005834的博客-CSDN博客

  • 相关阅读:
    android 之 ListView 里面嵌套 GridView 遇到的问题及其解决方法。
    Android ViewPager使用详解
    android背景选择器selector用法汇总
    GSON
    Android View事件机制 21问21答
    Android Drawable的9种子类 介绍
    Android tab导航的几种方法:ActionBar tab +fragment,Viewpager+pagerTitleStrip,开源框架ViewPageIndicator 和 ViewPager
    提取页面共性用抽象类来写页面模板
    对SharePreference的封装
    Android 主题和选择器
  • 原文地址:https://www.cnblogs.com/KAVEI/p/14774287.html
Copyright © 2011-2022 走看看