Opencv光流跟踪:停止条件
Opencv Optical flow tracking: stop condition
我目前正在尝试通过使用 opencv 的光流来实现面部跟踪。
为此,我使用 openCV 人脸检测器检测人脸,通过调用 goodFeaturesToTrack
确定要在检测到的区域上进行跟踪的特征,然后通过调用 calcOpticalFlowPyrLK
.[=14= 进行跟踪操作]
效果不错。
但是,我想知道我当前正在跟踪的面孔何时不再可见(此人离开房间,隐藏在物体或其他人后面,...)但是 calcOpticalFlowPyrLK
什么也没告诉我。
calcOpticalFlowPyrLK
函数的状态参数很少报告有关跟踪特征的错误(因此,如果这个人消失了,我仍然有大量有效特征要跟踪)。
我尝试计算每个特征的方向向量,以确定面部每个特征的前一帧和实际帧之间的移动(例如,确定面部的某个点向左移动在两个帧之间)并计算这些向量的方差(如果向量大部分不同,则方差很高,否则不是)但它没有给出预期的结果(在某些情况下好,但在其他情况下不好)。
确定光流跟踪是否必须停止的良好条件是什么?
我想到了一些可能的解决方案,例如:
- 每个跟踪特征的向量距离的方差(如果移动是线性的,距离应该几乎相同,但如果发生某些事情,距离将不同)。
- 比较包含跟踪要素原始位置的区域与包含当前要素的区域的形状和大小。一开始我们有一个包含面部特征的正方形。但如果人离开房间,就会导致形状变形。
您可以尝试对跟踪点进行双向置信度测量。
因此,估计从 img0 到 img1 的特征位置,而不是从 img1 到 img0 的跟踪位置。如果在原始附近(距离应小于 1 或 0.5 像素)进行双重跟踪,则跟踪成功。这个比opencv的plk的status flag用的SSD靠谱一点。如果无法跟踪一定数量的特征,则会引发事件。
我目前正在尝试通过使用 opencv 的光流来实现面部跟踪。
为此,我使用 openCV 人脸检测器检测人脸,通过调用 goodFeaturesToTrack
确定要在检测到的区域上进行跟踪的特征,然后通过调用 calcOpticalFlowPyrLK
.[=14= 进行跟踪操作]
效果不错。
但是,我想知道我当前正在跟踪的面孔何时不再可见(此人离开房间,隐藏在物体或其他人后面,...)但是 calcOpticalFlowPyrLK
什么也没告诉我。
calcOpticalFlowPyrLK
函数的状态参数很少报告有关跟踪特征的错误(因此,如果这个人消失了,我仍然有大量有效特征要跟踪)。
我尝试计算每个特征的方向向量,以确定面部每个特征的前一帧和实际帧之间的移动(例如,确定面部的某个点向左移动在两个帧之间)并计算这些向量的方差(如果向量大部分不同,则方差很高,否则不是)但它没有给出预期的结果(在某些情况下好,但在其他情况下不好)。
确定光流跟踪是否必须停止的良好条件是什么?
我想到了一些可能的解决方案,例如:
- 每个跟踪特征的向量距离的方差(如果移动是线性的,距离应该几乎相同,但如果发生某些事情,距离将不同)。
- 比较包含跟踪要素原始位置的区域与包含当前要素的区域的形状和大小。一开始我们有一个包含面部特征的正方形。但如果人离开房间,就会导致形状变形。
您可以尝试对跟踪点进行双向置信度测量。 因此,估计从 img0 到 img1 的特征位置,而不是从 img1 到 img0 的跟踪位置。如果在原始附近(距离应小于 1 或 0.5 像素)进行双重跟踪,则跟踪成功。这个比opencv的plk的status flag用的SSD靠谱一点。如果无法跟踪一定数量的特征,则会引发事件。