文章目录一、项目思路二、环境布置2.1、cvzone安装2.2、MediaPipe安装2.3、常见问题2.4、注意事项三、算法详解3.1、segmentor.removeBG()去除背景抠图3.2、cvzone.stackImages()堆叠图像3.3、fpsReader.update()更新帧图像3.4、os.listdir()返回指定的文件夹包含的文件或文件夹的名字的列表。四、实战基于计算机视觉库cvzone的背景替换一、项目思路设置框架参数指定存放图像的文件夹地址遍历图像并缩放至与框架相同尺寸移除摄像头拍摄的背景与指定图像进行叠加实时更新二、环境布置2.1、cvzone安装opencv是一个开源计算机视觉库。cvzone是一个开源计算机视觉库提供多种类型项目。如人脸检测、手部跟踪、姿势估计等以及图像处理和其他 AI 功能。它的核心是使用 OpenCV 和 MediaPipe 库。1在线下载DOS命令行窗口中输入pip install cvzone2离线下载安装包.gzPyPi官网下载地址cvzone计算机视觉库。安装过程如下DOS命令行窗口cd到安装包的setup.py路径然后输入python setup.py install更多项目可参考官网cvzone官网github2.2、MediaPipe安装MediaPipe 是一款由 Google Research 开发并开源的多媒体机器学习模型应用框架用于构建多模式视频音频和传感器应用的机器学习管道。可在移动设备、工作站和服务器上跨平台运行并支持移动 GPU 加速。1在线下载DOS命令行窗口中输入pip install opencv-pythonpip install mediapipe2离线下载.whlPyPi官网下载地址MediaPipe为移动、边缘、云和web构建世界级ML解决方案和应用程序的最简单方法。注意MediaPipe版本必须与Python的版本对应。更多项目可参考官网MediaPipe官网githubMediaPipe官网gitee-镜像2.3、常见问题关于python的mediapipe库踩过的坑2.4、注意事项如何减小锯齿和虚影1视频中布置的背景尽量简约如白墙等过多的东西容易变成干扰项。2手指间的虚影比较大尽量减少相关动作。三、算法详解3.1、segmentor.removeBG()去除背景抠图3.2、cvzone.stackImages()堆叠图像3.3、fpsReader.update()更新帧图像3.4、os.listdir()返回指定的文件夹包含的文件或文件夹的名字的列表。os.listdir()返回指定的文件夹包含的文件或文件夹的名字的列表。列表以字母排序。不包括 . 和 … 即使它在文件夹中。只支持在 Unix, Windows 下使用。函数说明listos.listdir(path)输入参数 path--需要列出的目录路径 输入参数 返回指定路径下的文件和文件夹列表。################################################folder_pathrC:\Users\my\Desktop\Images# 存放图像的文件夹路径不能有中文list_imgos.listdir(folder_path)# os.listdir(): 返回指定文件夹下的文件名列表结构print(list_img)# 打印文件夹中的图像名img_list[]# 存放自定义图像的列表forimg_pathinlist_img:# 遍历文件夹image_pathfolder_path/img_path# 读取图像路径imgcv2.imread(image_path)# 读取图像img_list.append(img)# 添加列表元素print(len(img_list))# 打印列表长度四、实战基于计算机视觉库cvzone的背景替换importcv2importcvzoneimportosfromcvzone.SelfiSegmentationModuleimportSelfiSegmentation# 摄像头的帧大小是640x480所以替换的背景图像大小应该与帧大小相同。# 设置参数capcv2.VideoCapture(0)# 获取图像设备0/1cap.set(3,640)# 调整输出框架的长cap.set(4,480)# 调整输出框架的宽cap.set(cv2.CAP_PROP_FPS,60)# 调整输出框架的帧速率segmentorSelfiSegmentation()# 实例化分割模型fpsReadercvzone.FPS()# 显示帧每秒fps的输出帧folder_pathrC:\Users\my\Desktop\Images# 存放背景图像的文件夹路径不能有中文可存放任意张图像list_imgos.listdir(folder_path)# os.listdir(): 返回指定文件夹下的文件名列表结构print(list_img)# 打印文件夹中的图像名img_list[]# 存放自定义图像的列表forimg_pathinlist_img:# 遍历文件夹image_pathfolder_path/img_path# 读取图像路径imgcv2.imread(image_path)# 读取图像print(img.size)# 打印图像尺寸imgcv2.resize(img,(640,480))# 图像缩放到指定尺寸img_list.append(img)# 添加列表元素print(len(img_list))# 打印列表长度img_index0# 初始化背景图片列表中索引0while1:reg,imgcap.read()# 读取帧图像img_outsegmentor.removeBG(img,img_list[img_index],threshold0.5)# 移除背景img_stackedcvzone.stackImages([img,img_out],2,1)# 图像叠加fps,img_stackedfpsReader.update(img_stacked,color(0,0,255))# 实时更新人物是动态的cv2.imshow(Image_stacked,img_stacked)# 图形化显示标题名 图像keycv2.waitKey(1)# 使用 waitKey 可以控制视频的播放速度。数值越小播放速度越快。ifkey0xFF27:# 按Esc退出breakelifkeyord(q):# 背景切换ifimg_index0:img_index-1# Q键在自定义的图片中正向选择图片elifkeyord(w):ifimg_indexlen(img_list)-1:img_index1# W键在自定义的图片中逆向选择图片Opencv项目实战你这背景太假啦