OpenCV中Lucas-Kanade跟踪器中的错误和状态输出

时间:2017-09-05 14:40:24

标签: python opencv tracking

阅读完OpenCV文档后,我仍无法弄清st, errp1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)的内容,以及何时需要使用它们。

1 个答案:

答案 0 :(得分:0)

如果您对您不了解的内容更具体,那会更好。 documentation for calcOpticalFlowPyrLK()说:

  

状态 - 输出状态向量(无符号字符);如果找到相应特征的流,则向量的每个元素设置为1,否则,设置为0   错误 - 错误的输出向量;向量的每个元素都设置为相应特征的错误,错误度量的类型可以在flags参数中设置;如果未找到流,则未定义错误(使用status参数查找此类情况)。

因此,假设您在图像或框架的边框上有一个特征,并且在下一个图像或框架中,该特征将消失。在下一帧中找不到该特征,因此status中该特征的相应索引将为0.否则,status在该索引处将为1。

err为0的任何地方都没有定义status值。否则,错误基本上是“两个图像/帧之间的特征周围相邻像素的对应程度”。在flags param:

下更清楚一点
  

OPTFLOW_LK_GET_MIN_EIGENVALS 使用最小特征值作为误差测量(参见minEigThreshold描述);如果未设置标志,则原始位置和移动点之间的补丁之间的L1距离除以窗口中的像素数,将用作错误度量。

L1距离只是窗口内绝对差值的总和。因此,这只是在两个图像/帧中的特征周围的窗口中查看,并计算每个窗口中相应像素之间的绝对差异,然后对它们求和。所以当标志设置时会发生这种情况。如果是,文档会指示我们查看minEigThreshold参数的说明:

  

minEigThreshold - 该算法计算光流方程的2x2正常矩阵的最小特征值(该矩阵在[Bouguet00]中称为空间梯度矩阵),除以a中的像素数窗口;如果此值小于minEigThreshold,则会过滤掉相应的功能并且不会处理其流量,因此可以删除坏点并提高性能。

因此,使用该标志,您可以看到每个要素的最小特征值 - 如果您想要计算出要使用的阈值,则非常有用。在original paper中,对于OpenCV文档(Bouguet00)中引用的LK特征跟踪器的金字塔实现,它详细说明了第3节(特征选择)中的含义:

  

到目前为止,我们已经描述了跟踪程序,该程序负责将 u 上的点 u 跟随 I 到另一个位置 v 另一个图像 J 。但是,我们尚未描述首先在 I 上选择 u 点的方法。此步骤称为特征选择。一旦引出跟踪的数学基础,就可以非常直观地解决特征选择问题。实际上,跟踪的核心步骤是计算光流向量η^ k (参见2.4节中的算法伪代码)。在该步骤, G 矩阵需要是可逆的,换句话说, G 的最小特征值必须足够大(大于阈值)。这表征了“易于跟踪”的像素。