使用OpenCV进行视频稳定

Eld*_*ila 36 c++ video opencv image-processing

我有一个视频输入,用移动相机拍摄并包含移动物体.我想稳定视频,以便所有静止物体在视频输入中保持静止.我怎么能用OpenCV做到这一点?

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

zer*_*erm 39

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

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

编辑 三个评论我应该明确提一下,以防万一:

  1. 基于单应性的方法可能非常精确,因此静止物体将保持静止.然而,单应包括透视变形和缩放以及所以结果可能看起来bit..uncommon(或对于一些快速运动甚至扭曲).虽然确切,但这可能在视觉上不那么令人愉悦; 所以请使用它进行进一步处理,或者像取证一样.但是你应该尝试一下,对某些场景/动作来说也是非常讨人喜欢的.
  2. 据我所知,至少有几个免费的视频稳定工具使用相位相关.如果你只是想"解锁"相机,这可能更好.
  3. 这个领域有很多研究正在进行中.在一些论文中你会发现一些更复杂的方法(尽管它们可能需要的不仅仅是OpenCV).


Oct*_*pus 15

OpenCV具有函数estimateRigidTransform()和warpAffine(),可以很好地处理这类问题.

它几乎就像这样简单:

Mat M = estimateRigidTransform(frame1,frame2,0)
warpAffine(frame2,output,M,Size(640,480),INTER_NEAREST|WARP_INVERSE_MAP) 
Run Code Online (Sandbox Code Playgroud)

现在output包含frame2最适合的内容frame1.对于大的移位,M将是一个零矩阵或根本不是一个矩阵,具体取决于OpenCV的版本,因此您必须过滤那些而不应用它们.我不确定那有多大; 可能是帧宽的一半,也许更多.

estimateRigidTransform的第三个参数是一个布尔值,告诉它是否也应用任意仿射矩阵或将其限制为平移/旋转/缩放.为了稳定相机中的图像,您可能只需要后者.实际上,对于相机图像稳定,您可能还希望通过将其归一化以仅旋转和平移来从返回的矩阵中移除任何缩放.

此外,对于移动相机,您可能希望通过时间对M进行采样并计算平均值.

以下是有关estimateRigidTransform()warpAffine()的更多信息的链接


Kin*_*t 金 5

我错过了这个答案。如何稳定网络摄像头视频?


昨天我刚刚Python在该主题上做了一些工作,主要步骤如下:

  1. 用于cv2.goodFeaturesToTrack寻找好的角落。
  2. 用于cv2.calcOpticalFlowPyrLK跟踪角落。
  3. 用于cv2.findHomography计算单应矩阵。
  4. 用于cv2.warpPerspective转换视频帧。

但是现在的结果不是那么理想,可能是我应该选择SIFT keypoints以外的其他方法goodFeatures


资源:

在此处输入图片说明

稳定汽车:

在此处输入图片说明