1. 内容:
(1) 基于摄像头或视频进行视频分解与合成;
(2) 图片融合,背景镂空;
(3) 交互技术,传统键盘\鼠标人机交互;
2. 设计流程:
本程序采用Python语言进行编程,首先导入相关的依赖库open CV, cvzone, mediapipe, protobuf==3.19.0。然后捕捉本地的摄像头命名为cap,设置图像的大小为640×480,设置fps更新频率为30,选择背景图片的路径 扫描路径下的图片,并展平为矩阵序列,默认的背景图片索引为第一张零。开始进行死循环,读取摄像头数据,然后去除摄像头里面的背景更改为目标图片背景,将原视频和听完后的视频进行合并,并在左上角打印对应的帧率,随后保存视频帧并且显示视频,通过按键来触发视频背景的一个切换动画效果,按a键逆序切换背景,按d键顺序切换背景,按q退出。最后是向释放摄像头资源,关闭所有窗口,结束程序。设计流程图如图1
3. 程序设计:
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。