📜  使用Python混合两个视频

📅  最后修改于: 2022-05-13 01:55:20.573000             🧑  作者: Mango

使用Python混合两个视频

先决条件:在Python使用 OpenCV 添加和混合图像

在本文中,我们将向您展示如何有效地将两个视频融合在一起。但为此,我们将首先了解什么是 Alpha 混合。

阿尔法混合

Alpha 混合是两种色调的曲线混合,考虑到计算机插图中的透明度影响。颜色代码中 alpha 的估计从 0.0 到 1.0,其中 0.0 表示完全透明的色调,而 1.0 表示完全暗的色调。当在颜色 Value0 的基础上绘制具有 Alpha alpha 值的颜色 Value1 时,对后续颜色的估计由下式给出:

Value = Value0(1.0 - Alpha) + Value1(Alpha)  

alpha 部分可以类似地用于混合到红色、绿色和蓝色段,就像在 32 位 RGBA 中一样,或者,再一次,可能会确定三种 alpha 质量,这些质量与光谱色调偏移的每个基本色调相关。

现在,我们将使用的第二件事是 OpenCV,它是一个专注于实时计算机视觉的编程函数库。但是,在继续之前,我们将记录一些事情。



要点

为了让我们的程序完美运行,您必须确保:

  1. 两个输入视频的分辨率和帧速率必须完全相同(在代码中它使用 1920×1080 格式,因此只能使用该格式,否则您必须使用输入的分辨率相应地设置 'h'、'w' 值我们稍后将在代码中看到的视频)
  2. 编写代码时,考虑到背景视频的持续时间略大于或等于前景视频的持续时间,因此您最好对背景和前景输入视频也做同样的事情,否则您必须将“ret”值分配给背景而不是前景,我们将在后面的代码中看到
  3. 使用唯一的名称重命名您的视频文件,因为如果有两个同名的视频文件,有时可能会导致错误,并且必须准确提供两个输入视频文件的路径。
  4. 前景视频必须是一些纯色背景(最好是黑色)和主体的一些运动的组合。

方法

我们将把两个视频作为输入,一个是我们的背景视频,第二个是我们的前景视频。主要工作是去除这个前景视频的纯色背景,这样我们就只剩下主题(前景视频的)透明背景。进行此更改后,前景视频将被放置在背景视频上,这会给单个视频带来一些效果的错觉,但实际上,将有两个视频混合在一起。这个魔法是在 OpenCV 和Python的帮助下完成的。

循序渐进的方法

  • 导入所需模块
  • 添加路径并捕获两个输入视频。
  • 遍历两个视频的每一帧,并使用Alpha Blending将它们混合在一起。
  • 播放生成的输出视频。

执行

输入:

前景视频

背景视频

请注意,前景视频仅包含具有纯黑色背景的粒子,因此为了获得更好的效果,最好拍摄这样的前景视频和背景视频。

Python3
# importing necessary packages
import numpy as np
import cv2
 
# assigning path of foreground video
path_1 = r"C://Users//Lenovo//Desktop//Python Workshop//z.mp4"
fg = cv2.VideoCapture(path_1)
 
# assigning path of background video
path_2 = r"C://Users//Lenovo//Desktop//Python Workshop//v.mp4"
bg = cv2.VideoCapture(path_2)
h, w = 1080, 1920
 
while True:
   
    # Reading the the two input videos
    # we have taken "ret" here because the duration
    # of bg video is greater than fg video,
    ret, foreground = fg.read()
     
    # if in your case the situation is opposite
    # then take the "ret" for bg video
    _, background = bg.read()
     
    # if foreground array is not empty which
    # means actual video is still going on
    if ret:
       
        # creating the alpha mask
        alpha = np.zeros_like(foreground)
        gray = cv2.cvtColor(foreground, cv2.COLOR_BGR2GRAY)
        alpha[:, :, 0] = gray
        alpha[:, :, 1] = gray
        alpha[:, :, 2] = gray
 
        # converting uint8 to float type
        foreground = foreground.astype(float)
        background = background.astype(float)
 
        # normalizing the alpha mask inorder
        # to keep intensity between 0 and 1
        alpha = alpha.astype(float)/255
 
        # multiplying the foreground
        # with alpha matte
        foreground = cv2.multiply(alpha,
                                  foreground)
 
        # multiplying the background
        # with (1 - alpha)
        background = cv2.multiply(1.0 - alpha,
                                  background)
 
        # adding the masked foreground
        # and background together
        outImage = cv2.add(foreground,
                           background)
 
        # resizing the masked output
        ims = cv2.resize(outImage, (980, 540))
 
        # showing the masked output video
        cv2.imshow('Blended', ims/255)
 
        # if the user presses 'q' then the
        # program breaks from while loop
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    # if the actual video is over then there's
    # nothing in the foreground array thus
    # breaking from the while loop
    else:
        break
         
print('Video Blending is done perfectly')


输出:

请注意,在此输出视频中,我们可以看到沙子在炎热的沙漠地区在空中移动,这实际上是粒子视频(用作前景)和沙漠视频(用作背景)的混合输出。此外,您始终可以按键盘上的“q”来中断循环并退出程序。

因此,通过这种方式,您可以混合两个视频,如果操作正确,这种方法还可以提供专业的编辑效果。