当前位置: 首页 > news >正文

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

1、项目展示

 今天我将用不到40行得代码实现背景板得移除和替换,大家看到了由于摄像头角度的问题,如果想切换背景,我不得不手向前伸,GIF图片中我用的外部摄像头,如果使用网络摄像头要稳定一些,如果想让人物的锯齿要小一些,可以穿个外套,条件好一点的,可以配一个靠背够大的椅子,这样对人物的影响也会小一些。如果你只是想使用,只用添加合适得图片在对应得文件夹下。所以在这里展示的是并不是最好的效果,为了让大家客观的评价,我是只穿了睡衣。

2、项目介绍

平常我们在各个平台,比如某音、B站、小红薯等,有这么一群创作者——虚拟人物、带有各种背景板的创作者,前段时间还玩出了一个“我的背景板假吗?”这样的梗,那么我们今天要制作的是更改我们的背景板,将原有的去除,添加上新的背景板,并可以通过敲击键盘对背景板进行切换(本项目中,‘q’表示-1,‘w’表示+1)。感兴趣的不妨收藏起来吧!!

3、项目准备

我们需要做的就是准备好640*480大小合适的背景图,从整个项目的难度来说,找到合适的图片比写代码还要困难,我查看了各个设计网站,稍微好点的都要VIP,而且大多数的大小还是我一个个在PS中修改的,那我在这里就不推荐了,如果想做这个项目,可以多花点心思在图片上(我一直在思考用GIF可以吗?),素材我会打包放在Github上面。

另外你需要下载cvzone的包:

pip install cvzone

4、代码的讲解与展示

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

cap=cv2.VideoCapture(1)
cap.set(3,640)
cap.set(4,480)
cap.set(cv2.CAP_PROP_FPS,60)
segmentor=SelfiSegmentation()
fpsReader =cvzone.FPS()


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 1:
    reg,img=cap.read()
    imgout = segmentor.removeBG(img,imglist[indeximg],threshold=0.8)

    imgstacked=cvzone.stackImages([img,imgout],2,1)
    fps,imgstacked=fpsReader.update(imgstacked,color=(0,0,255))
    print(indeximg)
    cv2.imshow("Imagestacked",imgstacked)
    key=cv2.waitKey(1)
    if key & 0xFF == 27:
        break
    elif key == ord('q'):
        if indeximg>0:
            indeximg -=1
    elif key == ord('w'):
        if indeximg<len(imglist)-1:
            indeximg +=1

cvzone这个包中的函数是公开的,如果大家想深入了解可以自己研究下,我在这里说说这个项目当中要用到的。

首先,引用所有需要的库,开启摄像头(外部摄像头与网络摄像头都可以),调整框架的长、宽、帧速率。cv2.CAP_PROP_FPS就是帧速率的意思,听说网上有人在这个地方出现了问题,有用外部摄像头无法使用的情况,那我经过尝试并没有,所以我也没法给出一个具体的原因。使用cvzone.FPS()来查找每秒帧数并显示在OpenCV图像上,也就是在展示效果中左上角的数字

 官网当中:

 接下来,我们又再次用到了os文件操作,返回Images目录中文件名的列表,我为了方便就之间用到0、1、2、3......等命名,这样放入列表中,以便我们读取图像。

['0.jpg', '1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg', '6.jpg', '7.jpg']

然后,在循环当中,捕获摄像头,

def removeBG(self, img, imgBg=(255, 255, 255), threshold=0.1)

 它是这样定义的,img是我们要从中删除背景的图片,imgBg是背景图像。那只要实现了索引的变化,我们就能完成背景板的替换,fpsReader.update(imgstacked,color=(0,0,255))要在其上显示的图像,用红色表示。

最后,点击'q':-1,'w':+1,点击Esc键,退出程序。

5、项目资源

GitHub:Opencv-project-training/Opencv project training/12 Replace And Remove Background at main · Auorui/Opencv-project-training · GitHub

6、项目总结

好了,近期我会多多更新实战项目,最近正在看CS231n,我会根据课程的内容更新相应的算法介绍。

所有的总结与本项目需要改进的地方,可以再仔细看看项目展示当中。

好了,如果你对本项目感兴趣,希望我能在评论区中找到你!!

网络摄像头的效果更好!!!

相关文章:

  • python解CCF-CSP真题《202209-1 如此编码》
  • 数据分析可视化08 案例 2:历史数据变化趋势图设计
  • Redis-缓存击穿
  • 信息学奥赛一本通:2072:【例2.15】歌手大奖赛
  • 【Linux】进程控制 (万字)
  • ARMv9新特性:虚拟内存系统架构 (VMSA) 的增强功能
  • 【JavaSE】之流程控制与方法
  • SpringCloud——网关1
  • 『Android基础入门』ViewPager+Fragment+BottomNavigationView实现底部导航
  • Regmap子系统:(寄存器映射)
  • 用通俗易懂的方式讲解:lightGBM 算法及案例(Python 代码)
  • TC8:TCP_CONTROL_FLAGS_05-08
  • 2022年华为杯研究生数学建模竞赛ABCDEF题思路资料汇总贴
  • JavaScript原生之垃圾回收原理、标记清理原理
  • python解CCF-CSP真题《202209-2 何以包邮?》
  • 《Java编程思想》读书笔记-对象导论
  • js作用域和this的理解
  • PAT A1017 优先队列
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • vue-loader 源码解析系列之 selector
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • vue学习系列(二)vue-cli
  • 官方解决所有 npm 全局安装权限问题
  • 后端_ThinkPHP5
  • 数据科学 第 3 章 11 字符串处理
  • 我与Jetbrains的这些年
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 智能合约Solidity教程-事件和日志(一)
  • HanLP分词命名实体提取详解
  • 阿里云ACE认证之理解CDN技术
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ###C语言程序设计-----C语言学习(6)#
  • #大学#套接字
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (06)Hive——正则表达式
  • (ros//EnvironmentVariables)ros环境变量
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (一)kafka实战——kafka源码编译启动
  • (译) 函数式 JS #1:简介
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .Net 代码性能 - (1)
  • .Net 路由处理厉害了
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .Net各种迷惑命名解释
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .NET委托:一个关于C#的睡前故事
  • .Net下的签名与混淆