假设我有 20 个视频。它们具有相同的场景、尺寸和来自同一台相机。让我们假设这二十个视频中的一个有一个人走过。所有其他视频大多相同(除了微小的自然变化,例如风吹树叶等)。
我正在寻找一种将所有 20 个视频合并为 1 个视频的好方法。我所说的合并是指“覆盖”。每个视频的所有帧都相互重叠,但以一种显示“差异”的方式。我想不出什么好办法。
这是我到目前为止所拥有的:(代码简化)。
基本上,我循环播放 20 个视频,将每个视频与下一个视频混合,并将新创建的混合视频与下一个视频一起使用,依此类推。
但是,因为我正在使用cv2.addWeighted
,有人走过的视频几乎消失(在 50% 的情况下叠加 20 次后)。如何创建保持“显着像素差异”的叠加视频?我不知道哪个视频是不同的,这毫无意义 - 所以我无法创建蒙版。鉴于大多数视频大多相似,应该有某种方法来保留显着不同的帧的特征。
videos = ['1.mp4', '2.mp4' , ...., '20.mp4']
for video in videos:
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('new-blended.mp4', fourcc, orig_fps, (width,height))
vid = cv2.VideoCapture(video) # read current video file
try:
blend_vid = cv2.VideoCaptire('blended.mp4')
except:
print ('No worries, this is the first video, we will create a blend now')
blend_vid = None
while True: # read all frames, blend
succ, frame = vid.read()
succ_b = False
if blend_vid: succ_b, frame_b = blend_vid.read()
if not succ_b and not succ:
break
if succ_b:
merged_frame = cv2.addWeighted(frame, 0.5, frame_b, 0.5, 0)
else:
merged_frame = frame
out.write(merged_frame)
try:
os.remove('blended.mp4')
except:
pass # will fail the first time
os.rename ('new-blended.mp4', 'blended.mp4')
添加更多上下文:
在这个特定的上下文中,“背景”是车道。前景将是人们进出的某些帧。我最感兴趣的是记录帧中的“差异”并保留它们。为了提供更多背景信息,我们假设有 20 个视频,每个视频时长 5 分钟。每个视频都是同一场景,连续录制超过 100 分钟。我希望创建一个时长 5 分钟的视频,将 20 个视频组合(叠加)在一起,保留“关键差异”。目标是帮助人们快速(5 分钟内)查看 100 分钟的车道视频,看看是否有任何“变化”。