将透明视频叠加到相机提要 OpenCV
Overlay transparent video to camera feed OpenCV
我一直在寻找如何将透明视频叠加到 Python(或实际上是任何语言)的摄像头源,我见过的最接近的方法是使用 opencv
。
我按照教程 here 做了一些实验。一个是在 while
循环中添加一个新的 VideoCapture
以在从相机捕获视频时播放文件中的视频;但是视频不会出现。
我遇到的其他事情是混合视频和摄像头源,但没有真正进行叠加。
我迷失了方向,非常感谢任何关于如何以编程方式进行操作的教程或链接。
更新:这是关于同时逐帧和逐时加载相机源和透明视频。
import cv2
import time
import numpy as np
current_milli_time = lambda: int(round(time.time() * 1000))
# Camera feed
cap_cam = cv2.VideoCapture(0)
if not cap_cam.isOpened():
print('Cannot open camera')
exit()
ret, frame_cam = cap_cam.read()
if not ret:
print('Cannot open camera stream')
cap_cam.release()
exit()
# Video feed
filename = 'myvideo.mp4'
cap_vid = cv2.VideoCapture(filename)
if not cap_cam.isOpened():
print('Cannot open video: ' + filename)
cap_cam.release()
exit()
ret, frame_vid = cap_vid.read()
if not ret:
print('Cannot open video stream: ' + filename)
cap_cam.release()
cap_vid.release()
exit()
# Specify maximum video time in milliseconds
max_time = 1000 * cap_vid.get(cv2.CAP_PROP_FRAME_COUNT) / cap_vid.get(cv2.CAP_PROP_FPS)
# Resize the camera frame to the size of the video
height = int(cap_vid.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(cap_vid.get(cv2.CAP_PROP_FRAME_WIDTH))
# Starting from now, syncronize the videos
start = current_milli_time()
while True:
# Capture the next frame from camera
ret, frame_cam = cap_cam.read()
if not ret:
print('Cannot receive frame from camera')
break
frame_cam = cv2.resize(frame_cam, (width, height), interpolation = cv2.INTER_AREA)
# Capture the frame at the current time point
time_passed = current_milli_time() - start
if time_passed > max_time:
print('Video time exceeded. Quitting...')
break
ret = cap_vid.set(cv2.CAP_PROP_POS_MSEC, time_passed)
if not ret:
print('An error occured while setting video time')
break
ret, frame_vid = cap_vid.read()
if not ret:
print('Cannot read from video stream')
break
# Blend the two images and show the result
tr = 0.3 # transparency between 0-1, show camera if 0
frame = ((1-tr) * frame_cam.astype(np.float) + tr * frame_vid.astype(np.float)).astype(np.uint8)
cv2.imshow('Transparent result', frame)
if cv2.waitKey(1) == 27: # ESC is pressed
break
cap_cam.release()
cap_vid.release()
cv2.destroyAllWindows()
我一直在寻找如何将透明视频叠加到 Python(或实际上是任何语言)的摄像头源,我见过的最接近的方法是使用 opencv
。
我按照教程 here 做了一些实验。一个是在 while
循环中添加一个新的 VideoCapture
以在从相机捕获视频时播放文件中的视频;但是视频不会出现。
我遇到的其他事情是混合视频和摄像头源,但没有真正进行叠加。
我迷失了方向,非常感谢任何关于如何以编程方式进行操作的教程或链接。
更新:这是关于同时逐帧和逐时加载相机源和透明视频。
import cv2
import time
import numpy as np
current_milli_time = lambda: int(round(time.time() * 1000))
# Camera feed
cap_cam = cv2.VideoCapture(0)
if not cap_cam.isOpened():
print('Cannot open camera')
exit()
ret, frame_cam = cap_cam.read()
if not ret:
print('Cannot open camera stream')
cap_cam.release()
exit()
# Video feed
filename = 'myvideo.mp4'
cap_vid = cv2.VideoCapture(filename)
if not cap_cam.isOpened():
print('Cannot open video: ' + filename)
cap_cam.release()
exit()
ret, frame_vid = cap_vid.read()
if not ret:
print('Cannot open video stream: ' + filename)
cap_cam.release()
cap_vid.release()
exit()
# Specify maximum video time in milliseconds
max_time = 1000 * cap_vid.get(cv2.CAP_PROP_FRAME_COUNT) / cap_vid.get(cv2.CAP_PROP_FPS)
# Resize the camera frame to the size of the video
height = int(cap_vid.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(cap_vid.get(cv2.CAP_PROP_FRAME_WIDTH))
# Starting from now, syncronize the videos
start = current_milli_time()
while True:
# Capture the next frame from camera
ret, frame_cam = cap_cam.read()
if not ret:
print('Cannot receive frame from camera')
break
frame_cam = cv2.resize(frame_cam, (width, height), interpolation = cv2.INTER_AREA)
# Capture the frame at the current time point
time_passed = current_milli_time() - start
if time_passed > max_time:
print('Video time exceeded. Quitting...')
break
ret = cap_vid.set(cv2.CAP_PROP_POS_MSEC, time_passed)
if not ret:
print('An error occured while setting video time')
break
ret, frame_vid = cap_vid.read()
if not ret:
print('Cannot read from video stream')
break
# Blend the two images and show the result
tr = 0.3 # transparency between 0-1, show camera if 0
frame = ((1-tr) * frame_cam.astype(np.float) + tr * frame_vid.astype(np.float)).astype(np.uint8)
cv2.imshow('Transparent result', frame)
if cv2.waitKey(1) == 27: # ESC is pressed
break
cap_cam.release()
cap_vid.release()
cv2.destroyAllWindows()