使用Python组合所有视频的功能

2024-09-27 21:30:27 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有20个视频。它们具有相同的场景、尺寸和来自同一个摄像头。假设这20个视频中有一个有人走过。所有其他的视频基本上是一样的(除了轻微的自然变化,如风吹树叶等)。你知道吗

我正在寻找一个很好的方法合并成一个视频所有的20个视频。我所说的合并是指“叠加”。每个视频的所有帧都相互重叠,但以一种“不同”的方式显示。我想不出一个好办法。 以下是我到目前为止得到的:(代码简化)。你知道吗

基本上,我在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分钟的车道视频,看看是否有什么“改变”。你知道吗


Tags: 方法read视频ifvideo场景mergedcv2
1条回答
网友
1楼 · 发布于 2024-09-27 21:30:27

感谢@Stephen Meschke的提示,我让它工作了,并且意识到只要你做得正确,它就相当不错了这并不是一个好的方法来做我想做的事情。“背景”和“前景”之间的区别不是很好。

不管怎样,这是我的密码。如果有人想办法改进,请告诉我:

“帧”是新视频中的帧“帧b”是在每次视频处理迭代中创建的混合视频。你知道吗

kernel_clean = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
kernel_fill = np.ones((20,20),np.uint8)

# get foreground objects from new frame
frame_mask = fgbg.apply(frame)
# clean noise
frame_mask = cv2.morphologyEx(frame_mask, cv2.MORPH_OPEN, kernel_clean)
# fill up foreground mask better
frame_mask = cv2.morphologyEx(frame_mask, cv2.MORPH_CLOSE, kernel_fill)

# remove grey areas, or set detectShadows=False in the extractor, which I learned later. However, removing shadows sometimes causes gaps in the primary foreground object. I found this to produce better results.
indices = frame_mask > 100
frame_mask[indices] = 255
# get only foreground images from the new frame
foreground_a = cv2.bitwise_and(frame,frame, mask=frame_mask)
# clear out parts on blended frames where forground will be added
frame_mask_inv = cv2.bitwise_not(frame_mask)
modified_frame_b = cv2.bitwise_and(frame_b, frame_b, mask=frame_mask_inv)
merged_frame = cv2.add(modified_frame_b, foreground_a)

相关问题 更多 >

    热门问题