使用光流进行特征跟踪

时间:2012-04-15 03:15:50

标签: c++ opencv computer-vision

我在论坛中找到了similar question。但那里的答案没有回答我的问题。

  • 如果我在第一个图像上只进行一次特征检测(goodFeaturesToTrack),然后使用光流(calcOpticalFlowPyrLK)来跟踪这些特征,问题是:只检测到的特征可以跟踪第一个图像。当这些功能超出图像时,就没有可追踪的功能。

  • 如果我为每个新图片执行功能检测 ,则功能跟踪不稳定,因为此时可能无法检测到上次检测到的功能。

我正在使用光流进行3D重建。因此,我对跟踪哪些功能不感兴趣,相反,我只关心是否可以稳定地跟踪视野中的功能。总而言之,我的问题是:如何使用光流跟踪旧功能,同时添加进入视野的新图像功能,并删除超出字段范围的旧功能查看?

3 个答案:

答案 0 :(得分:19)

有几种方法可行。一个好方法是这样的:

    第1帧中的
  1. 检测到N个要素,这是关键帧 m = 1
  2. 框架k中的
  3. 通过光流跟踪特征
  4. 在第k帧中,如果成功跟踪的要素数在N / 2下降:
    • 此框架是关键帧 m + 1
    • 计算单应性或描述关键帧 m和m + 1之间运动的基本矩阵
    • 检测N个功能并丢弃旧功能
    • k:= k + 1转到2
  5. 在这种方法中,您基本上可以估计最后两个关键帧之间的相机运动。

    由于您没有提到用于3D重建的方法,我假设首先计算 H F 以估算运动。为了准确估计它们,关键帧之间的基线应尽可能宽。通常,最佳策略是考虑相机的粗略运动模型。如果手持相机,则应将相机固定在汽车或机器人顶部时使用不同的策略。 如果有帮助,我可以在Python中提供一个最小的工作示例,请告诉我。

答案 1 :(得分:3)

仅出于文档目的,有一些良好的GPU / C ++光流跟踪实现。您的代码可能更适合您的目的,但如果您需要的只是曲目的输出数据,请考虑检查以下任何来源:hereherehere。< / p>

答案 2 :(得分:0)

还有另一种向现有功能添加新功能的好方法。您可以将掩码传递到cv::goodFeaturesToTrack()。因此,您将创建一个新Mat(与原始图像大小相同,type: CV_8UC1),将所有像素设置为255,并将每个特征点绘制为此Mat中的黑色圆圈。当您将此蒙版传递到goodFeaturesToTrack()时,该功能将跳过这些黑色圆圈。

我还建议限制功能的数量。我们假设您将其限制为MAX_FEATURES = 300。然后检查每个周期是否有比MAX_FEATURES - z (e.g. z = 30)更少的轨道。如果您这样做,请按上述方法搜索最多z个新功能,并将它们添加到您的功能容器中。

另请注意,在跟踪失败时您必须主动删除功能。因此,您必须查看calcOpticalFlowPyrLK的状态输出。