【问题标题】:Video Stabilization with OpenCV使用 OpenCV 进行视频稳定
【发布时间】:2011-03-26 18:38:41
【问题描述】:

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

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

【问题讨论】:

    标签: c++ video opencv image-processing


    【解决方案1】:

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

    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)。

    【讨论】:

    • 很好的答案!一个不错的清单。我不知道相位相关。谢谢!
    【解决方案2】:

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

    就这么简单:

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

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

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

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

    这里是有关estimateRigidTransform()warpAffine() 的更多信息的链接

    【讨论】:

    • Size 方法在哪个库中?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我已经通过这个回答了。 How to stabilize Webcam video?


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

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

      但是现在效果不太理想,可能我应该选择SIFT keypoints而不是goodFeatures


      来源:

      稳定汽车:

      【讨论】:

      • 你知道如何修复黑色区域吗?
      【解决方案5】:

      我应该添加以下备注以完成zerm's answer。 如果选择一个静止对象,然后使用 zerm 的方法 (1) 处理该单个对象,它将简化您的问题。 如果你找到一个静止的物体并对其进行校正,我认为可以肯定地假设其他静止的物体看起来也很稳定。

      虽然它肯定对您的棘手问题有效,但使用这种方法您会遇到以下问题:

      • 检测和单应性估计有时会因各种原因而失败:遮挡、突然移动、运动模糊、严重的照明差异。你将不得不寻找处理它的方法。

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

      • 根据您的硬件和解决方案的复杂性,使用 SURF 获得实时结果可能会有些困难。您可以尝试使用 opencv 的 gpu 实现或其他更快的特征检测器,如 ORB、BRIEF 或 FREAK。

      【讨论】:

        【解决方案6】:

        这已经是很好的答案,但它使用了一些旧算法,我开发了解决类似问题的程序,所以我添加了额外的答案。

        1. 首先,您应该使用 SIFT、SURF 算法等特征提取器从图像中提取特征。就我而言,FAST+ORB 算法是最好的。如果您想了解更多信息,See this paper
        2. 在你得到图像中的特征后,你应该找到与图像匹配的特征。匹配器有几个,但暴力匹配器还不错。如果您的系统中的 Bruteforce 速度很慢,您应该使用 KD-Tree 之类的算法。
        3. 最后,你应该得到几何变换矩阵,它可以最小化变换点的误差。您可以在此过程中使用 RANSAC 算法。 您可以使用 OpenCV 开发所有这些过程,我已经在移动设备中开发了它。 See this repository

        【讨论】:

          【解决方案7】:

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

          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

          随着时间的推移,这不适用于多个帧,因此您需要考虑使用background accumulator,以便算法寻找的背景随着时间的推移相似。

          【讨论】:

            【解决方案8】:

            背景: 我正在做这个研究项目,我试图计算排队的人到达柜台需要多长时间。我需要的第一件事是 FOOTAGE,所以我去了校园并记录了一些游客排队买票。到目前为止,我还不知道如何计算排队时间以及在录制镜头时应该采取什么预防措施。一天结束时,我发现我录制的所有镜头都是用摇摇晃晃的相机录制的。所以此时我首先需要稳定视频,然后才开发其他解决方案来计算排队时间。

            使用模板匹配进行视频稳定

            • 查找静态对象,例如投票、门或您知道不应该移动的东西
            • 使用模板匹配计算每个连续帧中静态对象(相对于帧边界)位置变化的偏移量。
            • 用偏移值翻译每一帧,例如 tx 和 ty。

            结果视频:

            Gif to show the result of this technique

            正如您在 gif 中看到的那样,选定的静态对象在帧边界处保持静态,而通过帧边缘的黑色填充可以看到运动。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-11-07
              • 1970-01-01
              • 2016-05-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多