我有一个视频提要,该视频提要用运动的摄像机拍摄,并包含运动的对象。我想稳定视频,以便所有静止的对象在视频源中保持静止。我该如何使用 OpenCV

即,例如,如果我有两个图像prev_frame和next_frame,如何转换 next_frame ,以便摄像机看起来静止不动?

最佳答案

我可以建议以下解决方案之一:

  • 使用本地高级功能:OpenCV包含SURF,因此:对于每个帧,提取SURF功能。然后构建要素Kd-Tree(也在OpenCV中),然后匹配每两个连续的帧以查找成对的对应要素。将这些对输入cvFindHomography以计算这些帧之间的单应性。根据(组合)单应性使翘曲框架稳定。据我所知,这是一种非常强大且复杂的方法,但是SURF提取和匹配可能非常慢
  • 如果您希望两个帧之间只有很小的移动,例如:使用Harris角点检测并在两个框架中构建彼此最接近的角点对,然后如上所述将其馈送到cvFindHomography。可能更快,但不够健壮。
  • 如果您将移动限制为翻译,则可以用更...简单的东西替换cvFindHomography,以仅获得特征对(例如平均)之间的翻译
  • 如果希望仅在两个帧之间进行转换,请使用相位相关(请参阅http://en.wikipedia.org/wiki/Phase_correlation)。 OpenCV包括DFT/FFT和IFFT,有关公式和解释,请参见链接的维基百科文章。

  • 编辑
    为了以防万一,我最好明确提及三点:
  • 基于单应性的方法可能非常精确,因此静止物体将保持静止。但是,单应符号也包括透视图失真和缩放,因此结果可能看起来有点不寻常(甚至在某些快速移动中甚至失真)。尽管准确,但在视觉上可能不太令人满意。因此,请将其用于进一步处理或取证。但是您应该尝试一下,对于某些场景/ Action 也可能非常讨人喜欢。
  • 据我所知,至少有几个免费的视频稳定工具使用了相位相关。如果您只想“取消摇动”相机,则可能更可取。
  • 在该 Realm 中正在进行很多研究。在某些论文中,您会发现很多更复杂的方法(尽管它们可能需要的不仅仅是OpenCV)。
  • 关于c++ - 使用OpenCV进行视频稳定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3431434/

    10-11 22:44
    查看更多