OpenCVForUnity学习教程——5

Advanced(高级)篇

2.Green Screen Example

这个demo有点难啃,可能因为图形学基础太弱,但基础实现目标还是能看懂,就是将人物和背景分离,由于我的背景为白色,所以直接用demo计算出的效果与原目的不大一样,这里我们把第134行定义背景色mat数据的代码稍微改一下,在末尾加上“, new Scalar(255, 255, 255, 255)”。(参照137行的加法,这里的颜色可以根据个人摄像头中的背景色调整,否则他就默认背景为黑色了)

这样运行出来的效果就好多了。

接下来细看代码,依旧是简单看一下初始化函数,然后聚焦到update,先不管按键触发内容,然后看到了函数findFgMaskMat,定位进去,首先是absdiff函数,计算当前帧与背景之差的绝对值,参考:https://blog.csdn.net/zdyueguanyun/article/details/50853477

这里absdiff正着反着调用了两次再求和,尝试了一下只调用第一次,大体上效果差不多,但没有调用两次求和的效果好(虽然demo最终的效果也并不理想,但是不影响我们继续看代码学习)。

然后是threshold函数,图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。参考:https://blog.csdn.net/u012566751/article/details/77046445

然后是转灰度图,再进行了两次二值化,区别是参数不一样,有关二值化参数,详细阅读:https://blog.csdn.net/lj501886285/article/details/52425157

具体这里为什么要三次二值化,还有三次参数不同是什么作用,就不大能理解了,后续再回头来看吧。(个人尝试了一下在仅absdiff一次的情况下,把第二次二值化去掉效果貌似更好点)

好,回到Update。

下一句是bitwise_not,是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作。这里很好理解了,经过上面一系列操作,fgMaskMat,前景的mat已经算出来了,然后取非,就是背景的mat,再将绿色greenMat,用背景mat的数据遮罩到rgbaMat上,就完成了绿幕的效果。

最后一句就是赋值图像。



这里还用到了一个判断,按空格键了之后将rgbamat放到右上角显示,但是实测按了空格键后会有别的bug,-。-。这里就不细看了,回头再研究解决。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容