使用光流进行特征跟踪
c++
computer-vision
opencv
8
0

我在论坛中找到了类似的问题 。但是那里的答案并不能回答我的问题。

  • 如果我仅在第一张图像上进行一次特征检测(goodFeaturesToTrack),然后使用光流(calcOpticalFlowPyrLK)跟踪这些特征,则问题是:只能跟踪在第一幅图像上检测到的特征。当这些功能超出图像范围时,将没有任何功能可追踪。

  • 如果我对每个新图像都进行特征检测,则特征跟踪不稳定,因为上次检测到的特征这次可能未检测到。

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

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

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

  1. 在第1帧中检测N个特征,这是关键帧 m = 1
  2. 在第k帧中,通过光流跟踪特征
  3. 如果成功跟踪的特征数下降到N / 2以下,则在第k帧中:
    • 该帧是关键帧 m + 1
    • 计算描述关键帧 m和m + 1之间运动的单应性或基本矩阵
    • 检测N个特征并丢弃旧特征
    • k:= k + 1转到2

在这种方法中,基本上,您可以估计摄像机在最后两个关键帧之间的运动。

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

收藏
评论

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题