我找到了 similar question在论坛中。但是里面的答案并没有回答我的问题。
如果我在第一张图片上只做一次特征检测(goodFeaturesToTrack)一次,然后使用光流(calcOpticalFlowPyrLK)来跟踪这些特征,问题是:只有在第一张图片上检测到的特征可以跟踪第一张图像。当这些特征超出图像时,将没有要跟踪的特征。
如果我对每张新图像进行特征检测,特征跟踪不稳定,因为上次检测到的特征这次可能检测不到。
我正在使用光流进行 3D 重建。所以我对跟踪什么特征不感兴趣,相反,我只关心视野中的特征是否可以稳定地跟踪。总而言之,我的问题是:如何使用光流来跟踪旧特征,同时添加进入视野的新图像特征并删除超出视野范围的旧特征查看?
最佳答案
有几种方法是可能的。一个好的方法是这样的:
- 在第 1 帧中检测 N 个特征,这是 关键帧 m=1
- 在第 k 帧中通过光流跟踪特征
- 如果成功跟踪的特征数量下降到 N/2 以下,则在第 k 帧中:
- 这一帧是关键帧 m+1
- 计算描述关键帧 m和m+1之间运动的单应性或基本矩阵
- 检测 N 个特征并丢弃旧特征
- k := k+1 转到 2
在这种方法中,您基本上可以估计最后两个关键帧之间的相机运动。
由于您没有提到用于 3D 重建的方法,我假设首先计算 H 或 F 以估计运动。为了准确地估计它们,关键帧之间的基线应该尽可能宽。一般来说,最好的策略是考虑相机的粗略运动模型。如果相机是用手握住的,则与将相机固定在汽车或机器人顶部时相比,应该使用不同的策略。 如果有帮助,我可以提供一个 Python 中的最小工作示例,请告诉我。
关于c++ - 使用光流进行特征跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10159236/