使用 Open CV 拼接视频

问题描述

我看到有关使用 Open CV 拼接图像的问题和答案。是否可以使用 Open CV 拼接视频。具体使用Python?我已经安装了 Open CV 的 Pycharm,并且能够让它播放一个录制的文件。但是,让它阅读两个并将它们拼接在一起会很棒。如果有人能指出我尚未找到的任何教程,我将不胜感激。 谢谢

解决方法

您可以使用 OpenCVfor/while 循环从两个视频中逐帧读取,在新帧中拼接帧(使用 numpy - 即 hstack())并保存它在新文件中(也逐帧)

稍后我创建示例。


但使用专门的模块(如 MoviePyffmpeg-pythonManim)可能更简单。
可能他们都使用具有许多功能和过滤器的程序 ffmpeg


MoviePy 为例 - 它在一行中创建包含两部电影的数组,但它可以创建包含多行和多列的数组。

from moviepy.editor import *

clip1 = VideoFileClip('input1.mp4')
clip2 = VideoFileClip('input2.mp4')
              
final_clip = clips_array([[clip1,clip2]])  # two videos in one row 

final_clip.write_videofile('output.mp4')

一栏有两个视频

final_clip = clips_array([[clip1],[clip2]])  # two videos in one column

并排列 2x2 视频

final_clip = clips_array([[clip1,clip2],[clip3,clip4]])

编辑:

使用 CV 编码。

它更长更复杂,但它显示视频。

import cv2
import numpy as np

clip1 = cv2.VideoCapture('input1.mp4')
clip2 = cv2.VideoCapture('input2.mp4')

width  = clip1.get(cv2.CAP_PROP_FRAME_WIDTH)
height = clip1.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps    = clip1.get(cv2.CAP_PROP_FPS) 
print('fps:',fps)              

video_format = cv2.VideoWriter_fourcc(*'MP42')  # .avi 
final_clip   = cv2.VideoWriter('output.avi',video_format,fps,(int(width),int(height)))

delay = int(1000/fps)
print('delay:',delay)              

while True:

    ret1,frame1 = clip1.read()
    ret2,frame2 = clip1.read()    

    if not ret1 or not ret2:
        break
        
    final_frame = np.vstack([frame1,frame2])  # two videos in one row
    final_clip.write(final_frame)

    cv2.imshow('Video',final_frame)
    key = cv2.waitKey(delay) & 0xFF
    
    if key == 27:
        break
    
cv2.destroyWindow('Video')

clip1.release()
clip2.release()