使用OpenCV进行视频稳定
c++
image-processing
opencv
6
0

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

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

参考资料:
Stack Overflow
收藏
评论
共 7 个回答
高赞 时间 活跃

这已经是一个很好的答案,但是它使用了一些旧算法,因此我开发了该程序来解决类似的问题,因此我添加了其他答案。

  1. 首先,您应该使用SIFT,SURF算法等特征提取器从图像中提取特征。就我而言,FAST + ORB算法是最好的。如果您需要更多信息, 请参阅本文
  2. 在获得图像中的特征之后,您应该找到与图像匹配的特征。有多个匹配器,但Bruteforce匹配器还不错。如果系统中的Bruteforce速度很慢,则应使用KD-Tree之类的算法。
  3. 最后,您应该获得几何变换矩阵,该矩阵可以最大程度地减少变换点的误差。您可以在此过程中使用RANSAC算法。您可以使用OpenCV开发所有这些过程,而我已经在移动设备中开发了它。 看到这个仓库
收藏
评论

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

  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. 基于单应性的方法可能非常精确,因此静止物体将保持静止。但是,单应符号也包括透视图失真和缩放,因此结果可能看起来有点不寻常(甚至在某些快速移动中甚至失真)。尽管准确,但在视觉上可能不太令人满意。因此,请将其用于进一步处理或取证。但是您应该尝试一下,对于某些场景/动作也可能非常讨人喜欢。
  2. 据我所知,至少有几个免费的视频稳定工具使用了相位相关。如果只想“取消摇动”相机,则可能更可取。
  3. 在这个领域有很多研究正在进行。在某些论文中,您会发现很多更复杂的方法(尽管它们可能需要的不仅仅是OpenCV)。
收藏
评论

这是一个棘手的问题,但是我可以提出一个稍微简单的情况。

  1. next_frame移动/旋转任意量
  2. 使用背景减法threshold(abs(prev_frame-next_frame_rotated))查找静态元素。您必须尝试使用要使用的阈值。
  3. 查找min(template_match(prev_frame_background, next_frame_rotated_background))
  4. 记录最接近的匹配的移位/旋转并将其应用于next_frame

随着时间的流逝,这对于多个帧而言效果不佳,因此您需要研究使用背景累加器,以便算法寻找的背景随时间推移而相似。

收藏
评论

openCV现在具有视频稳定类: http : //docs.opencv.org/trunk/d5/d50/group__videostab.html

收藏
评论

OpenCV的函数estimateRigidTransform()和warpAffine()可以很好地处理此类问题。

它非常简单:

Mat M = estimateRigidTransform(frame1,frame2,0)
warpAffine(frame2,output,M,Size(640,480),INTER_NEAREST|WARP_INVERSE_MAP) 

现在output包含frame2的内容,该内容最适合于frame1 。对于大班次,M将是零矩阵,或者可能根本不是矩阵,这取决于OpenCV的版本,因此您必须过滤它们而不应用它们。我不确定那有多大。也许是帧宽的一半,甚至更多。

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

另外,对于移动的相机,您可能需要对M进行采样并计算平均值。

这里有链接的详细信息在estimateRigidTransform() ,warpAffine()

收藏
评论

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


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

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

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


资源:

在此处输入图片说明

稳定汽车:

在此处输入图片说明

收藏
评论

我应该添加以下说明以补充zerm的答案 。如果选择了一个静止的物体,然后对该物体使用zerm的方法(1),它将简化您的问题。如果您找到一个静止的物体并对其进行校正,我认为可以假设其他静止物体看起来也很稳定。

尽管对于您的棘手问题肯定是有效的,但是使用此方法会遇到以下问题:

  • 由于各种原因,检测和单应性估计有时会失败:遮挡,突然移动,运动模糊,严重的光照差异。您将必须搜索处理它的方法。

  • 您的目标对象可能具有遮挡,这意味着其检测将在该帧上失败,并且您将不得不处理遮挡,这本身就是一个完整的研究主题。

  • 根据您的硬件和解决方案的复杂性,使用SURF获得实时结果可能会遇到一些麻烦。您可以尝试使用opencv的gpu实现或其他更快的功能检测器,例如ORB,BRIEF或FREAK。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号