我有一个包含移动物体的移动相机视频源,我想将视频稳定,使得所有静止的物体在视频中保持不动。如何使用OpenCV实现这一目标?
例如,如果我有两个图像prev_frame
和next_frame
,我该如何转换next_frame
以使视频看起来静止?
我有一个包含移动物体的移动相机视频源,我想将视频稳定,使得所有静止的物体在视频中保持不动。如何使用OpenCV实现这一目标?
例如,如果我有两个图像prev_frame
和next_frame
,我该如何转换next_frame
以使视频看起来静止?
我可以建议以下解决方案:
编辑 我应该明确提到三点,以防万一:
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()的更多信息链接:estimateRigidTransform()和warpAffine()。Size
方法在哪个库中? - user3731622Python
),主要步骤如下:
cv2.goodFeaturesToTrack
查找好的角点。cv2.calcOpticalFlowPyrLK
跟踪角点。cv2.findHomography
计算单应矩阵。cv2.warpPerspective
转换视频帧。SIFT keypoints
而不是goodFeatures
。
这里已经有一个好的答案,但使用了有点老旧的算法,而我开发了可以解决类似问题的程序,所以我添加了额外的答案。
next_frame
按任意量进行移动/旋转。threshold(abs(prev_frame-next_frame_rotated))
来查找静态元素。您需要尝试不同的阈值值。min(template_match(prev_frame_background, next_frame_rotated_background))
next_frame
背景: 我正在进行一个研究项目,试图计算一个人在排队等候时需要多长时间才能到达柜台。我首先需要的是录像素材,于是我去了校园并记录下了一些游客在排队购票时的移动情况。直到这个时候,我还不知道如何计算排队时间以及在录制素材时应该注意什么预防措施。最终,我发现我所记录的所有素材都是用抖动的相机拍摄的。因此,在这一点上,我首先需要稳定视频,然后才能开发其他解决方案来计算排队时间。
使用模板匹配进行视频稳定
结果素材:
正如您在gif中所看到的,选定的静态对象相对于帧边界保持静态,而运动可以通过从帧边缘填充黑色来看到。