OpenCV学习笔记(一)——光流法学习

xiaoxiao2021-02-28  73

OpenCV学习笔记(一)——光流法学习

1. Opencv实现

(1) calcOpticalFlowPyrLK 该方法使用的方法是基于图像金字塔的Lucas-Kanande算法,能够跟踪稀疏的光流,图像金字塔的作用是通过不断地下采样图片来减小两帧之间光流点的运动,从而保证识别的准确性(因为L-K算法只有在位移很小的时候才有作用)。具体用法如下:

void calcOpticalFlowPyrLK (InputArray 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 )

Parameters:

prevImg – 第一个8位输入图像或者通过 buildOpticalFlowPyramid()建立的金字塔 nextImg – 第二个输入图像或者和prevImg相同尺寸和类型的金字塔 prevPts – 二维点向量存储找到的光流;点坐标必须是单精度浮点数 nextPts – 输出二维点向量(用单精度浮点坐标)包括第二幅图像中计算的输入特征的新点位置;当OPTFLOW_USE_INITIAL_FLOW 标志通过,向量必须有和输入一样的尺寸 status – 输出状态向量(无符号char);如果相应的流特征被发现,向量的每个元素被设置为1,否则,被置为0 err – 输出错误向量;向量的每个元素被设为相应特征的一个错误,误差测量的类型可以在flags参数中设置;如果流不被发现然后错误未被定义(使用status(状态)参数找到此情形)。 winSize – 在每个金字塔水平搜寻窗口的尺寸 Count – 特征点的数目 level – 最大的金字塔层数。如果为 0 , 不使用金字塔 (即金字塔为单层),如果为 1 , 使用两层,下面依次类推 criteria – 准则,指定在每个金字塔层,为某点寻找光流的迭代过程的终止条件。

(2)calcOpticalFlowFarneback 用Gunnar Farneback 的算法计算稠密光流(即图像上所有像素点的光流都计算出来)。 (3)CalcOpticalFlowBM 通过块匹配的方法来计算光流。 (4)CalcOpticalFlowHS 用Horn-Schunck 的算法计算稠密光流。 (5)calcOpticalFlowSF 这一个是2012年欧洲视觉会议的一篇文章的实现:”SimpleFlow: A Non-iterative, Sublinear Optical FlowAlgorithm”。

2. 光流算法原理解释

(1)光流的概念是Gibson在1950年首先提出来的。它是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。一般而言,光流是由于场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。 (2)光流能够被计算出来的假设

相邻帧之间的亮度恒定相邻帧之间物体的运动比较微小同一子图像的像素点具有相同的移动

3. 金字塔Lucas-Kannade算法

(1)L-K算法有三个假设

亮度恒定,即图像场景中目标的像素在帧间运动时外观上保持不变;时间连续或者运动是”小运动“,即图像的运动随时间的变化比较缓慢;空间一致,即一个场景中同一表面上邻近的点具有相似的运动。

然而,对于大多数30HZ的摄像机,大而连贯的运动是普遍存在的情况,所以LK光流正因为这个原因在实际中的跟踪效果并不是很好。我们需要大的窗口来捕获大的运动,而大窗口往往违背运动连贯的假设!而图像金字塔可以解决这个问题,于是乎,金字塔Lucas-Kanade就提出来了。 (2)金字塔Lucas-Kanade跟踪方法 在图像金字塔的最高层计算光流,用得到的运动估计结果作为下一层金字塔的起始点,重复这个过程直到到达金字塔的最底层。这样就将不满足运动的假设可能性降到最小从而实现对更快和更长的运动的跟踪。

转载请注明原文地址: https://www.6miu.com/read-43867.html

最新回复(0)