Opencv光流跟踪:停止状态

Opencv Optical flow tracking: stop condition

本文关键字:状态 光流 跟踪 Opencv      更新时间:2023-10-16

我目前正在尝试通过使用opencv的光流实现人脸跟踪。

为了实现这一点,我使用openCV人脸检测器检测人脸,我通过调用goodFeaturesToTrack来确定要跟踪的检测区域的特征,并通过调用calcOpticalFlowPyrLK来操作跟踪。

结果很好。

然而,我想知道我当前跟踪的脸何时不再可见(该人离开房间,隐藏在物体或另一个人后面,…),但calcOpticalFlowPyrLK告诉我什么也没有。

calcOpticalFlowPyrLK函数的状态参数很少报告关于跟踪特征的错误(所以,如果这个人消失了,我仍然有大量的有效特征要跟踪)。

我试着计算每个特性确定的方向向量之间移动前面的和实际的框架为每个特征脸的(例如,确定一些点脸向左移动两帧之间的),并计算这些向量的方差(如果向量大多不同,方差高,否则这不是),但没有透露预期的结果(在某些情况下,好但坏在其他情况下)。

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

我想到了一些可能的解决方案,比如:

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

您可以尝试对您的跟踪点进行双向自信测量。因此,估计从img0到img1的特征位置,然后从img1到img0的跟踪位置。如果双轨迹特征靠近原始(距离应小于1或0.5像素),则它们被成功跟踪。这比openv的plk的状态标志所使用的SSD更可靠一些。