【Opencv项目实战】背景替换:动态背景移除与替换(cvzone+MediaPipe)
文章目录
- 一、项目思路
- 二、环境布置
- 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 cvzone
(2)离线下载(安装包.gz)
PyPi官网下载地址:cvzone:计算机视觉库。
安装过程如下:DOS命令行窗口cd到安装包的setup.py路径,然后输入python setup.py install
更多项目可参考官网:
cvzone官网(github)
2.2、MediaPipe安装
MediaPipe 是一款由 Google Research 开发并开源的多媒体机器学习模型应用框架,用于构建多模式(视频,音频和传感器)应用的机器学习管道。可在移动设备、工作站和服务器上跨平台运行,并支持移动 GPU 加速。
(1)在线下载
DOS命令行窗口中输入:
pip install opencv-python
pip install mediapipe
(2)离线下载(.whl)
PyPi官网下载地址:MediaPipe:为移动、边缘、云和web构建世界级ML解决方案和应用程序的最简单方法。注意:MediaPipe版本必须与Python的版本对应。
更多项目可参考官网:
MediaPipe官网(github)
MediaPipe官网(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 下使用。
函数说明:list = os.listdir(path)
输入参数 path -- 需要列出的目录路径
输入参数: 返回指定路径下的文件和文件夹列表。
################################################
folder_path = r"C:\Users\my\Desktop\Images" # 存放图像的文件夹路径(不能有中文)
list_img = os.listdir(folder_path) # os.listdir(): 返回指定文件夹下的文件名(列表结构)
print(list_img) # 打印文件夹中的图像名
img_list = [] # 存放自定义图像的列表
for img_path in list_img: # 遍历文件夹image_path = folder_path + '/' + img_path # 读取图像路径img = cv2.imread(image_path) # 读取图像img_list.append(img) # 添加列表元素
print(len(img_list)) # 打印列表长度
四、实战:基于计算机视觉库(cvzone)的背景替换
import cv2
import cvzone
import os
from cvzone.SelfiSegmentationModule import SelfiSegmentation# 摄像头的帧大小是640x480,所以替换的背景图像大小应该与帧大小相同。# 设置参数
cap = cv2.VideoCapture(0) # 获取图像设备(0/1)
cap.set(3, 640) # 调整输出框架的长
cap.set(4, 480) # 调整输出框架的宽
cap.set(cv2.CAP_PROP_FPS, 60) # 调整输出框架的帧速率
segmentor = SelfiSegmentation() # 实例化分割模型
fpsReader = cvzone.FPS() # 显示帧每秒(fps)的输出帧folder_path = r"C:\Users\my\Desktop\Images" # 存放背景图像的文件夹路径(不能有中文)(可存放任意张图像)
list_img = os.listdir(folder_path) # os.listdir(): 返回指定文件夹下的文件名(列表结构)
print(list_img) # 打印文件夹中的图像名
img_list = [] # 存放自定义图像的列表
for img_path in list_img: # 遍历文件夹image_path = folder_path + '/' + img_path # 读取图像路径img = cv2.imread(image_path) # 读取图像print(img.size) # 打印图像尺寸img = cv2.resize(img, (640, 480)) # 图像缩放到指定尺寸img_list.append(img) # 添加列表元素
print(len(img_list)) # 打印列表长度img_index = 0 # 初始化背景图片(列表中索引=0)
while 1:reg, img = cap.read() # 读取帧图像img_out = segmentor.removeBG(img, img_list[img_index], threshold=0.5) # 移除背景img_stacked = cvzone.stackImages([img, img_out], 2, 1) # 图像叠加fps, img_stacked = fpsReader.update(img_stacked, color=(0, 0, 255)) # 实时更新(人物是动态的)cv2.imshow("Image_stacked", img_stacked) # 图形化显示(标题名 + 图像)key = cv2.waitKey(1) # 使用 waitKey 可以控制视频的播放速度。数值越小,播放速度越快。if key & 0xFF == 27: # 按Esc退出breakelif key == ord('q'): # 背景切换if img_index > 0:img_index -= 1 # Q键:在自定义的图片中,正向选择图片elif key == ord('w'):if img_index < len(img_list)-1:img_index += 1 # W键:在自定义的图片中,逆向选择图片
Opencv项目实战:你这背景太假啦!
【Opencv项目实战】背景替换:动态背景移除与替换(cvzone+MediaPipe)相关推荐
- 基于C++的OpenCV项目实战——文档照片转换成扫描文件
基于C++的OpenCV项目实战--文档照片转换成扫描文件 一.背景 前段时间都是基于Python的OpecCV进行一些学习和实践,但小的知识点并没有应用到实际的项目中:并且基于Python的版本的移 ...
- Opencv项目实战-信用卡数字识别
Opencv项目实战:信用卡数字识别 导入库,定义展示函数 import cv2 import numpy as np from imutils import contours import myut ...
- Opencv项目实战:14 手势控制音量
目录 0.项目介绍 1.项目展示 2.项目搭建 3.项目的代码与讲解 4.项目资源 5.项目总结 0.项目介绍 本篇与上一篇有很多联系,大家可以看看这篇Opencv项目实战:13 手部追踪,我们将根据 ...
- 【Opencv项目实战】背景替换:帮你的证件照换个背景色
文章目录 方法一.基于removebg的背景替换 1.1.removebg介绍 1.2.环境配置 1.3.算法详解 1.4.实战:单张图片背景替换 1.5.实战:多张图片背景替换 1.6.实战:UI自 ...
- Opencv项目实战:12 你这背景太假啦!
1.项目展示 今天我将用不到40行得代码实现背景板得移除和替换,大家看到了由于摄像头角度的问题,如果想切换背景,我不得不手向前伸,GIF图片中我用的外部摄像头,如果使用网络摄像头要稳定一些,如果想让人 ...
- 【Opencv项目实战】目标追踪:实时追踪人工标注的多个目标
文章目录 一.项目思路 二.问题清单 三.算法详解 3.1.定义目标追踪算法 3.2.初始化追踪器 3.3.更新目标追踪器 3.4.绘制目标矩形框 3.5.人工标注感兴趣目标 3.5.1.标注ROI区 ...
- Opencv项目实战:15 手势缩放图片
目录 0.项目介绍 1.项目展示 2.项目搭建 3.项目的代码与讲解 4.项目资源 5.项目总结 0.项目介绍 本篇将会以HandTrackingModule为模块,这里的模块与之前的有所不同,请按照 ...
- [FineReport帆软]使用gif图片背景/设置动态背景
1.决策报表使用gif图片背景/动态背景 需要在报表块的初始化事件中添加js 1) 给整个body添加动态背景,js代码如下 setTimeout(function() {$('.content-co ...
- Opencv项目实战:基于dlib的疲劳检测
文章目录 一.项目简介 二.算法原理 三.环境配置 3.1.dlib人脸检测器:dlib.get_frontal_face_detector() 3.2.dlib关键点定位工具:shape_predi ...
最新文章
- android 线性布局位置,android – 如何在线性布局中更改视图的位置.
- Spring Filter过滤器,Spring拦截未登录用户权限限制
- OI模板大全(普及~省选NOI)
- 你不可不知的9种Lisp语言思想
- kibana使用_手把手教你使用Nginx实现Kibana的安全认证
- [leetcode][math] Add Digits
- Spring @Transactional踩坑记
- js(jQuery)获取时间的方法及常用时间类
- 几种纯css布局的导航栏
- (王道408考研操作系统)第二章进程管理-第一节2:进程状态及其切换
- 计算机课Word自我介绍,第5课 用WORD写篇自我介绍.doc
- labview嵌入c代码_LabVIEW是什么?与其他组态软件有何分别?
- java获取结果集_Java-如何获取结果集上的列名
- 微信小程序css方式animation动画弹幕实现
- 解决 1080端口已被占用
- R plot图片背景设置为透明_万能转换:R图转成Word、PPT、Excel、HTML、Latex、矢量图等...
- 电子邮件的收件人、抄送、密送
- Nature:我叫“P值” 这是我的故事
- 我在哪?要到哪里去?怎么去?
- -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口