Opencv光流跟踪:停止条件

时间:2015-08-26 14:40:42

标签: c++ opencv face-detection motion opticalflow

我目前正在尝试使用带有opencv的光流来实现面部跟踪。

为实现这一目标,我使用openCV人脸检测器检测面部,通过调用goodFeaturesToTrack确定要检测区域的功能,并通过调用calcOpticalFlowPyrLK进行跟踪。

它给出了很好的结果。

但是,我想知道我正在追踪的脸部何时不再可见(该人离开房间,隐藏在物体或其他人身后,......)但calcOpticalFlowPyrLK告诉我我一无所知。

calcOpticalFlowPyrLK函数的状态参数很少报告有关被跟踪要素的错误(因此,如果此人消失,我仍会有大量有效要跟踪的功能)。

我已经尝试计算每个特征的方向向量,以确定面部的每个特征在前一帧和实际帧之间的移动(例如,确定面部的某个点已经移动到左侧之间)两个框架)并计算这些向量的方差(如果向量大多不同,方差很高,否则不是)但它没有给出预期的结果(在某些情况下好,但在其他情况下不好)。

确定光流跟踪是否必须停止的良好条件是什么?

我已经想到了一些像这些可能的解决方案:

  • 每个跟踪特征的矢量距离的方差(如果移动是线性的,距离应该几乎相同,但如果发生了某些事情,距离将会不同)。
  • 将包含跟踪要素原始位置的区域的形状和大小与包含当前要素的区域进行比较。一开始我们有一个包含脸部特征的正方形。但如果这个人离开房间,可能会导致形状变形。

1 个答案:

答案 0 :(得分:1)

您可以尝试对跟踪点进行双向保密测量。 因此估计从img0到img1的特征位置以及从img1到img0的跟踪位置。如果原始距离(距离应小于1或0.5像素)的双跟踪特征比成功跟踪的要少。这比opencv的plk的状态标志所使用的SSD更可靠。如果无法跟踪某些特征,则事件会增加。