利用 opencv-python 将不带透明通道的MP4格式视频 制作成 Avpro Video 插件可播放的左右布局的 带透明通道的视频
原理很简单, 先找到一个背景不透明的视频,二值化,即可得到单通道视频,再将原视频与二值化后的视频左右拼接成一个视频
原视频
二值化
然后左右拼接
最后利用Avpro Video 在Unity3d 内播放
其中 AvproVideo插件的Packing设为LeftRight模式
最终效果:
视频制作代码如下:
import cv2
import numpy as np
import os
#读取原视频
cap = cv2.VideoCapture('彩带.mov')
index = 0
#将原视频保存成序列帧
while True:
ret, frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#单帧二值化
_, binary = cv2.threshold(gray, 30, 255, cv2.THRESH_BINARY)
binary_new = np.zeros_like(frame)
binary_new[:, :, 0] = binary
binary_new[:, :, 1] = binary
binary_new[:, :, 2] = binary
#将原图和二值化的图左右拼接成一张大图
final = np.hstack([frame, binary_new])
#按顺序保存
cv2.imwrite('dir/'+str(index).zfill(3)+'.jpg', final)
index += 1
c = cv2.waitKey(30)
cv2.imshow('frame', final)
if c == '27':
break
li= os.listdir('dir/')
frames = sorted(li)
#获取单帧的宽高,也就是即将合成的视频的宽高
img = cv2.imread('dir/000.jpg')
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
#视频参数
out = cv2.VideoWriter('彩带.mp4',fourcc, 25, (img.shape[1],img.shape[0]))
#合成视频
for item in li:
img = cv2.imread('dir/'+item)
out.write(img)
out.release()
cv2.waitKey(30)
cv2.destroyAllWindows()