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,我会根据课程的内容更新相应的算法介绍。

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

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

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

物联沃分享整理
物联沃-IOTWORD物联网 » Opencv项目实战:12 你这背景太假啦!

发表评论