使用光流进行特征跟踪

Shi*_*iyu 24 c++ opencv computer-vision

我在论坛中发现了类似的问题.但那里的答案并没有回答我的问题.

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

  • 如果我对每个新图像进行特征检测,则特征跟踪不稳定,因为此时可能无法检测到上次检测到的特征.

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

fir*_*ant 19

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

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

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

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