opencv跟踪

 

跟踪

跟踪中的概念

本章将介绍几种用于稠密光流的技术,稠密光流的稠密性在于对给定区域中的每一个像素进行运算

除了跟踪,运动目标建模也是一个值得关注的问题,建模不仅有助于解决跟踪技术,甚至实现最优跟踪,还能从帧与帧的关系中对目标的实际位置进行精度有限的测量估计

稠密光流

选择一个稠密的结构,其中运动矢量被分配给图像中每个像素,结果是能获得一个速度矢量场,允许我们在分析数据时使用更多新方法

在实践中计算稠密光流不容易,稠密理论必须具有一些容易跟踪的点之间进行插值的方法,才能解决那些更易模糊的点的运动计算

Farneback多项式扩展算法

该算法试图基于一种类似于把图像视为连续表面的分析技术来计算光流

第一阶段是将图像变换成与每个点相关联的二次多项式的表示,该多项式是基于近似的基于加权的像素周围的窗口,以使拟合对更靠近窗口中心的点更敏感;窗口的尺度决定了算法敏感特征的尺度

算法原理

用cv::calcOpticalFlowFarneback计算稠密光流

Dual TV-L1模型

HS在Dual TV-L1算法中起核心作用,HS算法通过定义流向量场和能量损失进行操作;能量损失是先前帧强度,后续帧强度和该流矢量场的函数.尝试在所有可能的流场中最小化这种能量函数u,将能量函数转换为欧拉-拉格朗日方程迭代求解

TV-L1意味着在平滑度约束使用L1范数的情况下,保真度约束被替换成总体变化(TV),总体变化将差分简单地求恶化,而不是平方和求和

选择L1范数的主要优点是局部梯度不会受到严重的惩罚,以至于算法在不连续性上表现更好。

使用总体变化而不是平方差的总和的重要性在于,有助于解决这种可选的能量函数

使用cv::createOptFlow_DualTVL1计算稠密光流

简单光流算法

要求图像中像素数为亚线性时间,通过基于金字塔的方案实现

当从金字塔中的粗糙层向精细层移动时,确定在新层中的像素处是否需要光流计算

如果发现在较细的水平没有获得新的信息则不进行光流计算,反之光流被简单传播到新的层并插入到新的层中

该算法试图为每个点建立一个局部流向量,可以最优解释该点周围邻域的运动

使用cv::Optflow::calcOpticalFlowSF() 计算光流