【发布时间】:2011-03-26 18:38:41
【问题描述】:
我有一个使用移动相机拍摄的视频源,其中包含移动对象。我想稳定视频,以便所有静止的物体在视频源中保持静止。如何使用 OpenCV 做到这一点?
即例如,如果我有两个图像 prev_frame 和 next_frame,我该如何变换 next_frame 使摄像机看起来是静止的?
【问题讨论】:
标签: c++ video opencv image-processing
我有一个使用移动相机拍摄的视频源,其中包含移动对象。我想稳定视频,以便所有静止的物体在视频源中保持静止。如何使用 OpenCV 做到这一点?
即例如,如果我有两个图像 prev_frame 和 next_frame,我该如何变换 next_frame 使摄像机看起来是静止的?
【问题讨论】:
标签: c++ video opencv image-processing
我可以建议以下解决方案之一:
编辑 我最好明确提及三句话,以防万一:
【讨论】:
OpenCV 有函数 estimateRigidTransform() 和 warpAffine() 可以很好地处理这类问题。
就这么简单:
Mat M = estimateRigidTransform(frame1,frame2,0)
warpAffine(frame2,output,M,Size(640,480),INTER_NEAREST|WARP_INVERSE_MAP)
现在output 包含最适合frame1 的frame2 的内容。
对于较大的班次,M 将是一个零矩阵,或者它可能根本不是一个矩阵,这取决于 OpenCV 的版本,因此您必须过滤它们而不是应用它们。我不确定那有多大。也许是框架宽度的一半,也许更多。
estimateRigidTransform 的第三个参数是一个布尔值,它告诉它是否也应用任意仿射矩阵或将其限制为平移/旋转/缩放。为了稳定来自相机的图像,您可能只需要后者。实际上,对于相机图像稳定,您可能还希望通过仅针对旋转和平移对其进行归一化来从返回的矩阵中移除任何缩放。
此外,对于移动的相机,您可能希望通过时间对 M 进行采样并计算平均值。
这里是有关estimateRigidTransform() 和warpAffine() 的更多信息的链接
【讨论】:
Size 方法在哪个库中?
openCV 现在有一个视频稳定类:http://docs.opencv.org/trunk/d5/d50/group__videostab.html
【讨论】:
我已经通过这个回答了。 How to stabilize Webcam video?
昨天我刚刚在这个主题上做了一些工作(Python),主要步骤是:
cv2.goodFeaturesToTrack 寻找好的角落。cv2.calcOpticalFlowPyrLK 跟踪角点。cv2.findHomography 计算单应矩阵。cv2.warpPerspective转换视频帧。但是现在效果不太理想,可能我应该选择SIFT keypoints而不是goodFeatures。
来源:
稳定汽车:
【讨论】:
我应该添加以下备注以完成zerm's answer。 如果选择一个静止对象,然后使用 zerm 的方法 (1) 处理该单个对象,它将简化您的问题。 如果你找到一个静止的物体并对其进行校正,我认为可以肯定地假设其他静止的物体看起来也很稳定。
虽然它肯定对您的棘手问题有效,但使用这种方法您会遇到以下问题:
检测和单应性估计有时会因各种原因而失败:遮挡、突然移动、运动模糊、严重的照明差异。你将不得不寻找处理它的方法。
您的目标对象可能有遮挡,这意味着它的检测将在该帧上失败,您将不得不处理遮挡,这本身就是一个完整的研究主题。
根据您的硬件和解决方案的复杂性,使用 SURF 获得实时结果可能会有些困难。您可以尝试使用 opencv 的 gpu 实现或其他更快的特征检测器,如 ORB、BRIEF 或 FREAK。
【讨论】:
这已经是很好的答案,但它使用了一些旧算法,我开发了解决类似问题的程序,所以我添加了额外的答案。
【讨论】:
这是一个棘手的问题,但我可以在脑海中提出一个稍微简单的情况。
next_frame
threshold(abs(prev_frame-next_frame_rotated)) 查找静态元素。您必须尝试使用什么阈值。min(template_match(prev_frame_background, next_frame_rotated_background))
next_frame
随着时间的推移,这不适用于多个帧,因此您需要考虑使用background accumulator,以便算法寻找的背景随着时间的推移相似。
【讨论】:
背景: 我正在做这个研究项目,我试图计算排队的人到达柜台需要多长时间。我需要的第一件事是 FOOTAGE,所以我去了校园并记录了一些游客排队买票。到目前为止,我还不知道如何计算排队时间以及在录制镜头时应该采取什么预防措施。一天结束时,我发现我录制的所有镜头都是用摇摇晃晃的相机录制的。所以此时我首先需要稳定视频,然后才开发其他解决方案来计算排队时间。
使用模板匹配进行视频稳定
结果视频:
Gif to show the result of this technique
正如您在 gif 中看到的那样,选定的静态对象在帧边界处保持静态,而通过帧边缘的黑色填充可以看到运动。
【讨论】: