(1) 基于摄像头或视频进行视频分解与合成;
(2) 图片融合,背景镂空;
(3) 交互技术,传统键盘\鼠标人机交互;
本程序采用Python语言进行编程,首先导入相关的依赖库open CV, cvzone, mediapipe, protobuf==3.19.0。然后捕捉本地的摄像头命名为cap,设置图像的大小为640×480,设置fps更新频率为30,选择背景图片的路径 扫描路径下的图片,并展平为矩阵序列,默认的背景图片索引为第一张零。开始进行死循环,读取摄像头数据,然后去除摄像头里面的背景更改为目标图片背景,将原视频和听完后的视频进行合并,并在左上角打印对应的帧率,随后保存视频帧并且显示视频,通过按键来触发视频背景的一个切换动画效果,按a键逆序切换背景,按d键顺序切换背景,按q退出。最后是向释放摄像头资源,关闭所有窗口,结束程序。设计流程图如图1
Python环境采用3.9,主程序是main.py, 背景源文件为"Images",运行后保存为’output.avi’,程序如下:
Images包含6张640*480 JPG图片,均来自网络
代码如下:
#参考1:https://blog.csdn.net/weixin_44278406/article/details/105248699
#参考2:https://www.bilibili.com/video/BV1iX4y1A7si?spm_id_from=333.337.search-card.all.click
#导入相关库opencv-python,cvzone,mediapipe,protobuf==3.19.0
#pip uninstall protobuf 降低版本兼容
#pip install protobuf==3.19.0
import cv2
import cvzone
from cvzone.SelfiSegmentationModule import SelfiSegmentation
import os
#捕捉本地摄像头
cap = cv2.VideoCapture(0)
#图像大小为640*480
cap.set(3, 640)
cap.set(4, 480)
#设置FPS更新帧率
cap.set(cv2.CAP_PROP_FPS, 30)
segmentor = SelfiSegmentation()
fpsReader = cvzone.FPS()
#定义保存路径和文件名
saveVideoPath = 'output.avi'
# 定义编解码器并创建VideoWriter对象
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(saveVideoPath, fourcc, 30.0, (1280, 480))
#背景图片路径选择(图片大小
ListImg = os.listdir("Images")
#打印路径下的图片名称
print(ListImg)
imgList = []
#读取所有背景图片并展平为矩阵
for imgPath in ListImg:
img = cv2.imread(f'Images/{imgPath}')
imgList.append(img)
#打印图片矩阵个数
print(len(imgList))
#默认索引第一张图片
indexImg = 0
while True:
#读取摄像头
success, img = cap.read()
if success == True:
#去背景为目标背景
imgOut = segmentor.removeBG(img, imgList[indexImg], threshold=0.80)
#排列原视频和替换背景的视频合并
imgStacked = cvzone.stackImages([img, imgOut], 2, 1)
#左上角打印对应帧率
_, imgStacked = fpsReader.update(imgStacked, color=(0, 255, 0))
#打印背景索引值
print(indexImg)
# 写入视频帧
out.write(imgStacked)
#显示合并视频
cv2.imshow("Image", imgStacked)
key = cv2.waitKey(1)
#按“a"逆序切换背景,按“d"顺序切换背景,按“q"退出
if key == ord('a'):
if indexImg > 0:
indexImg -= 1
else:
indexImg = len(imgList)-1
elif key == ord('d'):
if indexImg < len(imgList)-1:
indexImg += 1
else:
indexImg = 0
elif key == ord('q'):
break
# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()
按a键逆序切换背景,按d键顺序切换背景,按q退出。按演示过程效果背景1如图2,背景2如图3。
参考文献:
从摄像头中获取视频并保存
自己动手编程替换视频会议背景
资源下载:Python编程替换视频会议背景