文章目录

  • 一、项目思路
  • 二、环境布置
    • 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)的背景替换

一、项目思路

  1. 设置框架参数
  2. 指定存放图像的文件夹地址
  3. 遍历图像并缩放至与框架相同尺寸
  4. 移除摄像头拍摄的背景
  5. 与指定图像进行叠加
  6. 实时更新

二、环境布置

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)相关推荐

  1. 基于C++的OpenCV项目实战——文档照片转换成扫描文件

    基于C++的OpenCV项目实战--文档照片转换成扫描文件 一.背景 前段时间都是基于Python的OpecCV进行一些学习和实践,但小的知识点并没有应用到实际的项目中:并且基于Python的版本的移 ...

  2. Opencv项目实战-信用卡数字识别

    Opencv项目实战:信用卡数字识别 导入库,定义展示函数 import cv2 import numpy as np from imutils import contours import myut ...

  3. Opencv项目实战:14 手势控制音量

    目录 0.项目介绍 1.项目展示 2.项目搭建 3.项目的代码与讲解 4.项目资源 5.项目总结 0.项目介绍 本篇与上一篇有很多联系,大家可以看看这篇Opencv项目实战:13 手部追踪,我们将根据 ...

  4. 【Opencv项目实战】背景替换:帮你的证件照换个背景色

    文章目录 方法一.基于removebg的背景替换 1.1.removebg介绍 1.2.环境配置 1.3.算法详解 1.4.实战:单张图片背景替换 1.5.实战:多张图片背景替换 1.6.实战:UI自 ...

  5. Opencv项目实战:12 你这背景太假啦!

    1.项目展示 今天我将用不到40行得代码实现背景板得移除和替换,大家看到了由于摄像头角度的问题,如果想切换背景,我不得不手向前伸,GIF图片中我用的外部摄像头,如果使用网络摄像头要稳定一些,如果想让人 ...

  6. 【Opencv项目实战】目标追踪:实时追踪人工标注的多个目标

    文章目录 一.项目思路 二.问题清单 三.算法详解 3.1.定义目标追踪算法 3.2.初始化追踪器 3.3.更新目标追踪器 3.4.绘制目标矩形框 3.5.人工标注感兴趣目标 3.5.1.标注ROI区 ...

  7. Opencv项目实战:15 手势缩放图片

    目录 0.项目介绍 1.项目展示 2.项目搭建 3.项目的代码与讲解 4.项目资源 5.项目总结 0.项目介绍 本篇将会以HandTrackingModule为模块,这里的模块与之前的有所不同,请按照 ...

  8. [FineReport帆软]使用gif图片背景/设置动态背景

    1.决策报表使用gif图片背景/动态背景 需要在报表块的初始化事件中添加js 1) 给整个body添加动态背景,js代码如下 setTimeout(function() {$('.content-co ...

  9. Opencv项目实战:基于dlib的疲劳检测

    文章目录 一.项目简介 二.算法原理 三.环境配置 3.1.dlib人脸检测器:dlib.get_frontal_face_detector() 3.2.dlib关键点定位工具:shape_predi ...

最新文章

  1. android 线性布局位置,android – 如何在线性布局中更改视图的位置.
  2. Spring Filter过滤器,Spring拦截未登录用户权限限制
  3. OI模板大全(普及~省选NOI)
  4. 你不可不知的9种Lisp语言思想
  5. kibana使用_手把手教你使用Nginx实现Kibana的安全认证
  6. [leetcode][math] Add Digits
  7. Spring @Transactional踩坑记
  8. js(jQuery)获取时间的方法及常用时间类
  9. 几种纯css布局的导航栏
  10. (王道408考研操作系统)第二章进程管理-第一节2:进程状态及其切换
  11. 计算机课Word自我介绍,第5课 用WORD写篇自我介绍.doc
  12. labview嵌入c代码_LabVIEW是什么?与其他组态软件有何分别?
  13. java获取结果集_Java-如何获取结果集上的列名
  14. 微信小程序css方式animation动画弹幕实现
  15. 解决 1080端口已被占用
  16. R plot图片背景设置为透明_万能转换:R图转成Word、PPT、Excel、HTML、Latex、矢量图等...
  17. 电子邮件的收件人、抄送、密送
  18. Nature:我叫“P值” 这是我的故事
  19. 我在哪?要到哪里去?怎么去?
  20. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口

热门文章

  1. Unity + SteamVR + VIVE Pro进行动作捕捉
  2. 如何使用Chrome浏览器,打包生成自己的插件(crx格式文件)?
  3. 怎么更改电脑桌面文件存放路径
  4. C++中fstream
  5. 树莓派 MFRC522 读取
  6. Java工具集-MD5加密工具
  7. Java中常用的Dos命令
  8. MySql 循环执行语句,循环执行update,详细介绍【游标嵌套】
  9. wire tox_Tox-rs的漫长旅程。 第1部分
  10. Linux部署lamp(centos 7),照做就行