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,-。-。这里就不细看了,回头再研究解决。

你可能感兴趣的:(OpenCVForUnity学习教程——5)