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,我会根据课程的内容更新相应的算法介绍。
所有的总结与本项目需要改进的地方,可以再仔细看看项目展示当中。
好了,如果你对本项目感兴趣,希望我能在评论区中找到你!!
网络摄像头的效果更好!!!
上一篇:
JS实现多线程数据分片下载
下一篇:
买房不要只考虑当前公司所在的位置!