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,我会根据课程的内容更新相应的算法介绍。
所有的总结与本项目需要改进的地方,可以再仔细看看项目展示当中。
好了,如果你对本项目感兴趣,希望我能在评论区中找到你!!
网络摄像头的效果更好!!!
版权归原作者 夏天是冰红茶 所有, 如有侵权,请联系我们删除。