使用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,它是一个专注于实时计算机视觉的编程函数库。但是,在继续之前,我们将记录一些事情。
要点
为了让我们的程序完美运行,您必须确保:
- 两个输入视频的分辨率和帧速率必须完全相同(在代码中它使用 1920×1080 格式,因此只能使用该格式,否则您必须使用输入的分辨率相应地设置 'h'、'w' 值我们稍后将在代码中看到的视频)
- 编写代码时,考虑到背景视频的持续时间略大于或等于前景视频的持续时间,因此您最好对背景和前景输入视频也做同样的事情,否则您必须将“ret”值分配给背景而不是前景,我们将在后面的代码中看到
- 使用唯一的名称重命名您的视频文件,因为如果有两个同名的视频文件,有时可能会导致错误,并且必须准确提供两个输入视频文件的路径。
- 前景视频必须是一些纯色背景(最好是黑色)和主体的一些运动的组合。
方法
我们将把两个视频作为输入,一个是我们的背景视频,第二个是我们的前景视频。主要工作是去除这个前景视频的纯色背景,这样我们就只剩下主题(前景视频的)透明背景。进行此更改后,前景视频将被放置在背景视频上,这会给单个视频带来一些效果的错觉,但实际上,将有两个视频混合在一起。这个魔法是在 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”来中断循环并退出程序。
因此,通过这种方式,您可以混合两个视频,如果操作正确,这种方法还可以提供专业的编辑效果。