我有一个使用移动摄像头拍摄并包含移动对象的视频输入。我想稳定视频,以便所有静止物体在视频输入中保持静止。我怎么能这样做OpenCV?使用OpenCV进行视频稳定
即例如,如果我有两个图像prev_frame和next_frame,我该如何转换next_frame因此摄像机显示为静止?
我有一个使用移动摄像头拍摄并包含移动对象的视频输入。我想稳定视频,以便所有静止物体在视频输入中保持静止。我怎么能这样做OpenCV?使用OpenCV进行视频稳定
即例如,如果我有两个图像prev_frame和next_frame,我该如何转换next_frame因此摄像机显示为静止?
我可以建议如下解决方案中的一种:
编辑 三的言论,我应该更好地明确提及,以防万一:
这是一个棘手的问题,但我可以建议一个有点简单的情况我的头顶。任意量
threshold(abs(prev_frame-next_frame_rotated))
next_frame
找到静态元素。你必须玩弄使用什么样的阈值。min(template_match(prev_frame_background, next_frame_rotated_background))
next_frame
这将不能很好的为多帧随着时间的工作,所以你要考虑使用background accumulator所以算法查找的背景是相似的。
我要添加下面的注释来完成zerm's answer。 如果选择了一个静止物体,然后用zerm的方法(1)处理该单个物体,它将简化您的问题。 如果您发现一个静止的物体并对其进行修正,我认为假设其他静止的物体也会保持稳定是安全的。
虽然它肯定是有效的为您的难题,你将有以下的问题这种方法:
检测和单应估计有时会失败的各种原因:闭塞,突然的动作,运动模糊,严重的照明差异。你将不得不寻找方法来处理它。
您的目标对象可能有遮挡,这意味着它的检测将在该帧上失败,您将不得不处理遮挡,这本身就是一个整体研究主题。
根据您的硬件和解决方案的复杂性,您可能会遇到一些使用SURF实现实时结果的麻烦。您可以尝试opencv的gpu实现或其他更快的特征检测器,如ORB,BRIEF或FREAK。
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的版本,因此您必须对其进行过滤,而不应用它们。我不确定这有多大;可能是框架宽度的一半,也许更多。
estimatedRigidTransform的第三个参数是一个布尔值,它告诉它是否也应用任意仿射矩阵或将其限制为平移/旋转/缩放。为了稳定照相机的图像,您可能只需要后者。事实上,对于相机图像稳定,您可能还想通过将其归一化为仅旋转和平移来从返回的矩阵中去除任何缩放。
此外,对于移动相机,您可能希望通过时间抽样M并计算平均值。
这里是链接到estimateRigidTransform()更多信息,与warpAffine()
什么库是'Size'方法中的? – user3731622 2018-01-05 20:03:55
的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
来转换视频帧。但现在结果不是那么理想,可能是我应该选择而不是goodFeatures
。
来源:
稳定汽车:
伟大的答案!一个不错的清单。我不知道相位相关。谢谢 ! – 2012-06-01 12:00:49