多画面延迟播放影片
这篇教学会如何使用 OpenCV 将同一个影片,排列组合成九宫格、十六宫格、二十五宫格...等多画面,并在多画面中制作出延迟播放的效果。
因为程序中的 OpenCV 会需要使用镜头或 GPU,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda ) ,并安装 OpenCV 函数库 ( 参考:OpenCV 函数库 )。
缩小影片尺寸,合成黑色背景
使用 NumPy 产生全黑背景后,读取摄影镜头的图像并改变图像尺寸 ( 使用变数进行设定,让后续修改较为弹性 ),将图像放在全黑背景的左上角。
import cv2
import numpy as np
cap = cv2.VideoCapture(0) # 讀取攝影鏡頭
output = np.zeros((360,640,3), dtype='uint8') # 產生 640x360 的黑色背景
if not cap.isOpened():
print("Cannot open camera")
exit()
n = 5 # 設定要分成幾格
w = 640//n # 計算分格之後的影像寬度 ( // 取整數 )
h = 360//n # 計算分格之後的影像高度 ( // 取整數 )
while True:
ret, img = cap.read() # 讀取影像
img = cv2.resize(img,(w, h)) # 縮小尺寸
output[0:h, 0:w] = img # 將 output 的特定區域置換為 img
cv2.imshow('oxxostudio', output)
if cv2.waitKey(50) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
影片延迟播放效果
建立一个空串列,将摄影机取得的图像依序存入串列中,并保持串列最大长度为图像总数,由于 while 循环会不断更新串列内容,只要每次更新时重新组合串列中的图像,就能产生延迟播放的效果。
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
output = np.zeros((360,640,3), dtype='uint8')
if not cap.isOpened():
print("Cannot open camera")
exit()
n = 5
w = 640//n
h = 360//n
img_list = [] # 設定空串列,記錄每一格的影像
while True:
ret, img = cap.read()
img = cv2.resize(img,(w, h))
img_list.append(img) # 每次擷取影像時,將影像存入串列
if len(img_list)>n*n: del img_list[0] # 如果串列長度超過可容納的影像數量,移除第一個項目
for i in range(len(img_list)):
x = i%n # 根據串列計算影像的 x 座標 ( 取餘數 )
y = i//n # 根據串列計算影像的 y 座標 ( 取整數 )
output[h*y:h*y+h, w*x:w*x+w] = img_list[i] # 更新畫面
cv2.imshow('oxxostudio', output)
if cv2.waitKey(50) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
微信扫码关注
抖音扫码关注