介绍

OpenCV是一个开源计算机视觉库,可提供播放不同图像和视频流的权限,还有助于端到端项目,如对象检测、人脸检测、对象跟踪等。

CVzone是一个计算机视觉包,可以让我们轻松运行像人脸检测、手部跟踪、姿势估计等,以及图像处理和其他 AI 功能。它的核心是使用 OpenCV 和 MediaPipe 库。请点击此处获取更多信息。

  • https://github.com/cvzone/cvzone

为什么需要实时背景去除?

由于许多原因,视频的背景需要修改,如背景中有很多其他中断或背景颜色不适合该人。因此,我们使用实时背景替换技术来替换背景并添加替换为所需内容。

流行的背景去除技术

图像剪切路径 - 如果图像的主题具有锐利的边缘,则使用此技术。所有落在路径之外的元素都将被消除。

图像剪切 – 在这里,我们剪切帧中所需的区域或主题并删除背景。

图像遮罩 – 如果图像有褶边或细边缘,我们可以使用图像遮罩技术。

擦除背景 – 使用任何不同的工具擦除图像的背景

许多著名的应用程序使用背景去除技术并用自定义技术替换它。在这里,我们将实现类似的东西,使用 OpenCV 和 CVzone。

让我们开始实施

安装所需的模块。

-- pip install OpenCV-python-- pip install cvzone-- pip install mediapipe

首先,让我们检查一下我们的网络摄像头是否工作正常。

import cv2cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)while True:
success, img = cap.read()
cv2.imshow("Image", img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break

如果你有网络摄像头,上面的代码会弹出一个窗口,这里的帧大小是 640 X 480。所以我们需要注意,因为背景替换图像的大小应该与帧大小相同,即 640 X 480 .

现在在这里创建项目目录中的文件夹,我正在创建一个名为*'BackgroundImages'*的文件夹。你可以下载任何图像或任意数量的图像并将它们放在此目录中。

项目结构将如下图所示:

让我们在单独的 python 文件中编写一小段代码,将*“BackgroundImages”*文件夹中的所有图像大小调整 为 640 X 480。

import cv2
import osfor root, subdirs, files in os.walk('D:/pycharmprojects/BackgroundRemover/BackgroundImages'):for f in files:if f.endswith('jpg'):# print(f)img = cv2.imread('D:/pycharmprojects/BackgroundRemover/BackgroundImages/' + f)img = cv2.resize(img, (640, 480))cv2.imwrite('D:/pycharmprojects/BackgroundRemover/BackgroundImages/'+f, img)print(*["Image", f, "is resized to 640 X 480"])

上面的代码将读取指定文件夹中的图像(jpg)文件,并一次将所有图像调整为 640 X480。

调整所有图像大小后的输出

现在我们都准备好实现背景替换技术了。

导入需要的模块

import cv2
import cvzone
from cvzone.SelfiSegmentationModule import SelfiSegmentation
import os

在上面的模块中,*“SelfSegmentation”*用于删除框架的背景并将其替换为我们目录中的图像。

cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)
# cap.set(cv2.CAP_PROP_FPS, 60)
segmentor = SelfiSegmentation()
fpsReader = cvzone.FPS()
# imgBG = cv2.imread("BackgroundImages/3.jpg")listImg = os.listdir("BackgroundImages")
imgList = []
for imgPath in listImg:img = cv2.imread(f'BackgroundImages/{imgPath}')imgList.append(img)indexImg = 0

在上面的代码中,我们采取从网络摄像头输入,并且还设置帧宽度为640 X 480

然后调用SelfiSegmentation() ,并将其分配给一个变量segmentor,并且为了在显示帧每秒(fps)的输出帧,我们使用*cvzone.FPS()*函数。

然后我们创建一个存在于BackgroundImages文件夹中的图像列表,我们遍历该列表并读取每个图像并将其附加到一个空列表中。初始索引设置为零。

while True:success, img = cap.read()# imgOut = segmentor.removeBG(img, (255,0,255), threshold=0.83)imgOut = segmentor.removeBG(img, imgList[indexImg], threshold=0.8)imgStack = cvzone.stackImages([img, imgOut], 2,1)_, imgStack = fpsReader.update(imgStack)print(indexImg)cv2.imshow("image", imgStack)key = cv2.waitKey(1)if key == ord('a'):if indexImg>0:indexImg -=1elif key == ord('d'):if indexImg<len(imgList)-1:indexImg +=1elif key == ord('q'):break

现在主要部分在 while 循环中从网络摄像头读取帧,我们使用*segmentor.removeBG()*函数从帧中删除背景并将其替换为目录中的图像。

在上面的代码中,你可以看到我们已经向segmentor.removeBG()函数传递了三个参数 ,即来自网络摄像头的图像帧(img),然后是目录中存在的图像列表以及图像索引(imgList[indexImg) ]),最后是阈值。如果阈值设置为 1,则阈值会削减所有内容,这里我们将其设置为 0.8,为了获得更好的边缘,请使用不同的阈值。

然后我们使用cvzone.stackImages堆叠图像*,* 这里我们将获得背景替换图像或帧的输出。然后使用一个简单的 if 语句,分配键来更改背景。

例如,如果我们有 10 张背景图像,根据上面的代码,我们可以使用键“a”或键“d”来更改帧的背景。

整个代码如下。

import cv2
import cvzone
from cvzone.SelfiSegmentationModule import SelfiSegmentation
import oscap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)
# cap.set(cv2.CAP_PROP_FPS, 60)segmentor = SelfiSegmentation()
fpsReader = cvzone.FPS()# imgBG = cv2.imread("BackgroundImages/3.jpg")listImg = os.listdir("BackgroundImages")
imgList = []
for imgPath in listImg:img = cv2.imread(f'BackgroundImages/{imgPath}')imgList.append(img)indexImg = 0while True:success, img = cap.read()# imgOut = segmentor.removeBG(img, (255,0,255), threshold=0.83)imgOut = segmentor.removeBG(img, imgList[indexImg], threshold=0.8)imgStack = cvzone.stackImages([img, imgOut], 2,1)_, imgStack = fpsReader.update(imgStack)print(indexImg)cv2.imshow("image", imgStack)key = cv2.waitKey(1)if key == ord('a'):if indexImg>0:indexImg -=1elif key == ord('d'):if indexImg<len(imgList)-1:indexImg +=1elif key == ord('q'):break

输出截图如下

输出 1:

输出 2:

整个代码也可以在这里找到:

https://github.com/BakingBrains/Real-Time_Background_remover

参考:

https://www.youtube.com/watch?v=k7cVPGpnels

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

使用 OpenCV+CVzone 进行实时背景替换相关推荐

  1. 【Opencv项目实战】背景替换:动态背景移除与替换(cvzone+MediaPipe)

    文章目录 一.项目思路 二.环境布置 2.1.cvzone安装 2.2.MediaPipe安装 2.3.常见问题 2.4.注意事项 三.算法详解 3.1.segmentor.removeBG():去除 ...

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

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

  3. OpenCV C++案例实战六《绿幕视频背景替换》

    OpenCV C++案例实战六<绿幕视频背景替换> 前言 一.图像预处理 二.HSV色彩空间转换 1. cvtColor色彩空间转换 2. inRange抠图 三.背景替换 四.源码 总结 ...

  4. opencv证件照背景替换

    #include <QCoreApplication> #include "opencv2/opencv.hpp"using namespace cv; using n ...

  5. OpenCV之图像分割(五) 证件照背景替换

    算法设计步骤: 代码与注释: /* 流程处理思路: 先通过Kmeans训练,目的为了得到背景像素的一个标记(个人觉得没有这个必要,性价比太低了) 利用这个标记跟证件照的原图进行一波处理,得到背景跟前景 ...

  6. 基于python的证件照_python3基于OpenCV实现证件照背景替换

    本文实例为大家分享了python3实现证件照背景替换的具体代码,供大家参考,具体内容如下 import cv2 import numpy as np img=cv2.imread('zjz.jpg') ...

  7. android opencv 获取小图在大图的坐标_Android开发—基于OpenCV实现相机实时图像识别跟踪...

    利用OpenCV实现实时图像识别和图像跟踪 图像识别 什么是图像识别 图像识别,是指利用计算机对图像进行处理.分析和理解,以识别各种不同模式的目标和对像的技术.根据观测到的图像,对其中的物体分辨其类别 ...

  8. OpenCV4学习笔记(57)——基于GrabCut图像分割算法实现背景替换与背景虚化效果

    在上一篇笔记<OpenCV4学习笔记(56)>中,整理了关于在OpenCV中使用GrabCut图像分割算法的相关内容,那么本次笔记就以GrabCut算法为基础来实现对图像的背景替换和背景虚 ...

  9. C++ 纯 OpenCV 实现扑克牌实时识别

    C++ 纯 OpenCV 实现扑克牌实时识别 网上有很多用OpenCV或其他工具实现扑克牌或者简单的数字识别demo,但都讲的不够简洁清晰或者提供的代码太混乱,所以我自己用OpenCV实现了一下这个d ...

最新文章

  1. smobiler介绍(二)
  2. oracle导入时提示IMP-00010:不是有效的导出文件,头部验证失败
  3. 用matplotlib的imshow显示图像,设置colorbar的颜色范围
  4. eclipse中Preferences的一些设置
  5. [Hands On ML] 5. 支持向量机
  6. SkyEye实现工业安全关键领域基础软件国产替代
  7. 执行ios命令_MEDUZA:一款针对iOS应用程序的通用SSL解绑工具
  8. 机器学习- 吴恩达Andrew Ng 编程作业技巧
  9. Abaqus2022安装教程
  10. java 框架_java三大主流框架是什么
  11. 中文语句情感分类系统的设计与实现
  12. 笔记本输字母p出现仅计算机,电脑打不了字只有字母怎么办?最简单的解决方法...
  13. 英语语法基础入门怎么学好
  14. 微信小程序云开发———云存储
  15. app闪退后重启_iphone 开启App狂闪退?6个步骤即刻救援!
  16. c语言中字符后u代表什么意思,C语言中的0U或1U是什么意思?
  17. 《精益数据分析》-第二部分概括笔记
  18. plc和c语言谁的前景好,PLC面向对象编程和梯形图逻辑,到底谁更实用一些?
  19. Redis主从架构 | 黑马Redis高级篇
  20. 2018-2019-2 20175227张雪莹《Java程序设计》实验四 《Android程序设计》

热门文章

  1. 2007年的有潜力的绩优股
  2. 视频分析的“新革命”——久凌视频分析产品
  3. (四)计算机取证-用FTK Imager-X ways Forensics取证复制
  4. 控制网络技术(英文三)
  5. Tiva单片机——简易示波器(UART串口屏)
  6. GPU大百科全书 第四章:虚与实共舞的TMU
  7. Google Map apiv3叠加层
  8. 简单易懂SpringBoot和Android上传和下载文件方案——采用URL
  9. 仪表盘(用ECharts绘制)
  10. GPFS——三大关键组件