CalcOpticalFlowPyrLK

来源:互联网 发布:码栈完善聚划算编程 编辑:程序博客网 时间:2024/05/19 09:47
计算一个稀疏特征集的光流,使用金字塔中的迭代 Lucas-Kanade 方法。
C接口:
void cvCalcOpticalFlowPyrLK( const CvArr* prev, const CvArr* curr, CvArr* prev_pyr, CvArr* curr_pyr, const CvPoint2D32f* prev_features, CvPoint2D32f* curr_features, int count, CvSize win_size, int level, char* status, float* track_error, CvTermCriteria criteria, int flags );
  • prev
  • 在时间 t 的第一帧
  • curr
  • 在时间 t + dt 的第二帧
  • prev_pyr
  • 第一帧的金字塔缓存. 如果指针非 NULL , 则缓存必须有足够的空间来存储金字塔从层 1 到层 #level 的内容。尺寸 (image_width+8)*image_height/3 比特足够了
  • curr_pyr
  • 与 prev_pyr 类似, 用于第二帧
  • prev_features
  • 需要发现光流的点集
  • curr_features
  • 包含新计算出来的位置的 点集
  • count
  • 特征点的数目
  • win_size
  • 每个金字塔层的搜索窗口尺寸
  • level
  • 最大的金字塔层数。如果为 0 , 不使用金字塔 (即金字塔为单层), 如果为 1 , 使用两层,下面依次类推。
  • status
  • 数组。如果对应特征的光流被发现,数组中的每一个元素都被设置为 1, 否则设置为 0。
  • error
  • 双精度数组,包含原始图像碎片与移动点之间的差。为可选参数,可以是 NULL .
  • criteria
  • 准则,指定在每个金字塔层,为某点寻找光流的迭代过程的终止条件。
  • flags
  • 其它选项:
    • CV_LKFLOW_PYR_A_READY , 在调用之前,第一帧的金字塔已经准备好
    • CV_LKFLOW_PYR_B_READY , 在调用之前,第二帧的金字塔已经准备好
    • CV_LKFLOW_INITIAL_GUESSES , 在调用之前,数组 B 包含特征的初始坐标 (Hunnish: 在本节中没有出现数组 B,不知是指的哪一个)
函数 cvCalcOpticalFlowPyrLK 实现了金字塔中 Lucas-Kanade 光流计算的稀疏迭代版本 ([Bouguet00])。 它根据给出的前一帧特征点坐标计算当前视频帧上的特征点坐标。 函数寻找具有子象素精度的坐标值。
两个参数 prev_pyr 和 curr_pyr 都遵循下列规则: 如果图像指针为 0, 函数在内部为其分配缓存空间,计算金字塔,然后再处理过后释放缓存。 否则,函数计算金字塔且存储它到缓存中,除非设置标识 CV_LKFLOW_PYR_A[B]_READY 。 图像应该足够大以便能够容纳 Gaussian 金字塔数据。 调用函数以后,金字塔被计算而且相应图像的标识可以被设置,为下一次调用准备就绪 (比如:对除了第一个图像的所有图像序列,标识 CV_LKFLOW_PYR_A_READY 被设置).
C++接口:
void calcOpticallFlowPyrLK (InuputArray 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位的前一帧图像或金字塔图像。
-nextImg:和prevImg有相同的大小和类型,后一帧图像或金字塔。
-prevPts:计算光流所需要的输入2D点矢量,点坐标必须是单精度浮点数。
-nextPts:输出2D点矢量(也是单精度浮点数坐标),点矢量中包含的是在后一帧图像上计算得到的输入特征新位置。
-status:输出状态矢量(元素是无符号char类型,uchar),如果相应特征的流发现则矢量元素置为1,否则,为0。
-err:输出误差矢量。
-winSize:每个金字塔层搜索窗大小。
-maxLevel:金字塔层的最大数目;如果置0,金字塔不使用(单层);如果置1,金字塔2层,等等以此类推。
-criteria:指定搜索算法收敛迭代的类型
-minEigTheshold:算法计算的光流等式的2x2常规矩阵的最小特征值。
金字塔Lucas-Kannade算法:
LK算法有三个假设:亮度恒定,即图像场景中目标的像素在帧间运动时外观上保持不变;时间连续或者运动是”小运动“,即图像的运动随时间的变化比较缓慢;空间一致,即一个场景中同一表面上邻近的点具有相似的运动。然而,对于大多数30HZ的摄像机,大而连贯的运动是普遍存在的情况,所以LK光流正因为这个原因在实际中的跟踪效果并不是很好。我们需要大的窗口来捕获大的运动,而大窗口往往违背运动连贯的假设!而图像金字塔可以解决这个问题,于是乎,金字塔Lucas-Kanade就提出来了。
金字塔Lucas-Kanade跟踪方法是:在图像金字塔的最高层计算光流,用得到的运动估计结果作为下一层金字塔的起始点,重复这个过程直到到达金字塔的最底层。这样就将不满足运动的假设可能性降到最小从而实现对更快和更长的运动的跟踪。
0 0
原创粉丝点击