c++ - 使用光流进行特征跟踪

标签 c++ opencv computer-vision

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

  • 如果我在第一张图片上只做一次特征检测(goodFeaturesToTrack)一次,然后使用光流(calcOpticalFlowPyrLK)来跟踪这些特征,问题是:只有在第一张图片上检测到的特征可以跟踪第一张图像。当这些特征超出图像时,将没有要跟踪的特征。

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

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

最佳答案

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

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

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

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

关于c++ - 使用光流进行特征跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10159236/

相关文章:

machine-learning - 我们可以用多个边界框预测器替换对象检测中的 anchor 框吗?

c++ - 尝试使用 cmake 交叉编译 qt 应用程序时出现链接问题

c++ - ffmpeg的libswscale中 "sw"是什么意思?

c++ - 如何释放由 "new"分配的内存,但不显式引用相应的指针

python - 使用OCR识别的文本对图像进行模糊处理

python - 使用 Python 改进用于 AR 应用的视频两帧之间的单应性估计

python - opencv创建圈出界

c++ - 为什么空表达式在 C/C++ 中是合法的?

java - 无法在 opencv 4.1.0 中解析 DescriptorExtractor 和 FeatureDetector 的导入

python - 如何通过检测直线检测主体结构轮廓