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

1、项目展示

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

2、项目介绍

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(fImages/{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:

6、项目总结

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

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

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

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

经验分享 程序员 微信小程序 职场和发展