编程去除背景绿幕抠图,基于NETOp

北京中科白癜风医院路线 https://m-mip.39.net/disease/yldt/bjzkbdfyy/

摘要:本文介绍了一种使用OpenCVSharp对摄像头中的绿幕视频进行实时“抠人像、替换背景”的方式,对于项目中的算法进行了分析。本文中给出了简化OpenCVSharp中Mat、MatExpr等托管资源释放的方法。本文还介绍了“高效摄像头播放控件”以及和OpenCVSharp的性能优化技术,包括高效读写Mat数据、如何避免效率低的代码等。

一、为什么自己开发实时抠图软件

由于工作的需要,我需要一个能够对于摄像头中的人像进行实时地“扣除背景、替换背景,并且把替换背景后的图片显示到窗口中”的功能。很多会议直播软件都有类似的功能,比如Zoom、微软Teams等都有人像抠图功能,但是他们的这些功能都只局限于在它们的软件内使用。我又试用了几个软件,包括XSplitVcam、抖音直播伴侣、OBS,他们的功能都做的很优秀,包括很多都还有不需要绿幕的智能抠图的功能,非常强大,但是他们都无法满足我的特殊要求。所以我需要自己开发这样一款软件。

典型的人像抠图需要在被抠图的物体之后放上绿幕,然后再通过程序把绿幕扣除掉,这样人像就被保留下来了,再把抠出来的人像绘制到新的背景图上即可。很多影视制作都是用类似这样的原理制作出来的。如图1所示[1]。

图1

只要环境光线调整好了,通过绿幕进行抠图是非常准确的,不过这种方式的缺点就是对于场地的布置要求非常高。所以现在流行“无绿幕抠图”的功能,也就是用人工智能的方法智能识别前景人像和背景,然后智能的把前景人像识别出来。XSplitVcam有这个功能,而且可以把抠图的结果再模拟成一个虚拟摄像头进行输出,属于民用领域中比较强悍的一款软件,但是如果背景比较复杂的话,XSplitVcam移除背景的效果仍然不理想。我个人在计算机视觉方面,特别是结合人工智能进行图像的智能处理方面,研究很浅,我不认为在时间有限的情况下,能写出来一个比Vcam还要强大的软件,因此我决定仍然用传统的绿幕形式来实现我想要的功能,毕竟只要花几十块钱买一块绿幕即可。

在开始讲解实现代码之前,先展示一下软件的运行效果。图2是相机采集的原始图像,可以看到背后是一张绿幕,而图3则是软件运行后的效果,而且是实时抠图的,目前可以做到大约20FPS(一秒钟约20帧)。

图2没有抠绿幕图3抠人像、替换背景

二、软件架构

软件使用了OpenCV,它是一个非常成熟、功能丰富的计算机视觉库。OpenCV支持C/C++、Python、.NET、Java等主流的编程语言。在互联网上,使用Python进行OpenCV开发的资料最多。由于个人不是很喜欢Python的语法,所以这个软件我使用C#语言在.NET5平台上进行开发。由于OpenCV在各个编程语言上用法大同小异,因此这里用C#实现的代码改用其他编程语言也非常容易。

.NET平台下,有两个OpenCV的绑定库:OpenCVSharp和EmguCV。由于OpenCVSharp没有商业使用限制,因此我这里使用OpenCVSharp。不过,即使您使用的是EmguCV,这篇文章里的代码也是简单修改后就可以应用到EmguCV中。

三、如何获得源代码

由于抠绿幕替换背景的功能只是我的软件的一个模块,整个软件暂时不方便开源,所以我把抠绿幕替换背景这部分核心代码功能剥离到一个单独的开源项目中。

项目开源


转载请注明:http://www.aierlanlan.com/grrz/1727.html