从Lucas-Kanade光流中移除异常值

时间:2014-06-10 06:51:51

标签: opencv opticalflow outliers

关于SO也有类似的问题,但我没有找到我想要的答案。我需要实现强大的光流以跟踪(检测到的)面部的特征。我使用goodFeaturesToTrack / SURF(我还没决定哪个最好)来获取初始功能。

我的问题是如何消除光流产生的异常值? RANSAC是否适用于此,如果是,您如何将其与calcOpticalFlowPyrLK结合使用?

我还想过拒绝位移大于阈值的功能,但这只是一个想法,并不是真的知道如何实现它(如何选择阈值,我应该计算平均位移等)。那么,哪种方法最好?

2 个答案:

答案 0 :(得分:2)

如果你有一个你期望你的动作符合的模型,RANSAC是一个很好的和强大的选择 一般来说,LK是本地流,并且不必符合任何(全局)运动模型,因此在许多情况下RANSAC是不合适的。

对于一般流程,您可以考虑:

  1. 对称流量:从A到B的LK流量给出与从B到A的独立LK流量相同的结果。
  2. 动作范围:使用特定于域的知识,例如去除那些太大,太稀疏,与邻居太不一样的动作。

答案 1 :(得分:1)

如果您使用流量点网格而不是特征检测,那么您可以通过将结果与周围流量点进行比较来评估流量点。如果与周围矢量的距离太大,您可以消除它们。但是,使用不规则功能进行此操作相当昂贵。

如果您在多个帧上连续跟踪(具有相同的特征),您还可以添加一些时间平滑度假设。例如从N到N + 1的跟踪向量可能与从N-1到N和N + 1到N + 2的向量非常相似。

通常,通过上面提到的功能消除可疑向量总是有意义的: - 非常长的载体 - 高误差的向量 - 跟踪梯度较差的点(如果对特征使用角点检测,则已排除)

只有当你对一个相当全球化的特征特别感兴趣时,Ransac才有用。例如头部的运动。但我猜这不是你感兴趣的东西(否则你可能也只是采取所有向量的平均值)