我在论坛中找到了similar question。但那里的答案没有回答我的问题。
如果我在第一个图像上只进行一次特征检测(goodFeaturesToTrack),然后使用光流(calcOpticalFlowPyrLK)来跟踪这些特征,问题是:只检测到的特征可以跟踪第一个图像。当这些功能超出图像时,就没有可追踪的功能。
如果我为每个新图片执行功能检测 ,则功能跟踪不稳定,因为此时可能无法检测到上次检测到的功能。
我正在使用光流进行3D重建。因此,我对跟踪哪些功能不感兴趣,相反,我只关心是否可以稳定地跟踪视野中的功能。总而言之,我的问题是:如何使用光流跟踪旧功能,同时添加进入视野的新图像功能,并删除超出字段范围的旧功能查看?
答案 0 :(得分:19)
有几种方法可行。一个好方法是这样的:
在这种方法中,您基本上可以估计最后两个关键帧之间的相机运动。
由于您没有提到用于3D重建的方法,我假设首先计算 H 或 F 以估算运动。为了准确估计它们,关键帧之间的基线应尽可能宽。通常,最佳策略是考虑相机的粗略运动模型。如果手持相机,则应将相机固定在汽车或机器人顶部时使用不同的策略。 如果有帮助,我可以在Python中提供一个最小的工作示例,请告诉我。
答案 1 :(得分:3)
答案 2 :(得分:0)
还有另一种向现有功能添加新功能的好方法。您可以将掩码传递到cv::goodFeaturesToTrack()
。因此,您将创建一个新Mat(与原始图像大小相同,type: CV_8UC1
),将所有像素设置为255,并将每个特征点绘制为此Mat中的黑色圆圈。当您将此蒙版传递到goodFeaturesToTrack()
时,该功能将跳过这些黑色圆圈。
我还建议限制功能的数量。我们假设您将其限制为MAX_FEATURES = 300
。然后检查每个周期是否有比MAX_FEATURES - z (e.g. z = 30)
更少的轨道。如果您这样做,请按上述方法搜索最多z个新功能,并将它们添加到您的功能容器中。
另请注意,在跟踪失败时您必须主动删除功能。因此,您必须查看calcOpticalFlowPyrLK
的状态输出。