opencv实现两幅图叠加

第一种方法用到的是addWeighted函数,函数的用法见下图:


然后自己写了一份测试代码,其中src是大图,wifiLogo是小图,程序和效果见下图:


第二种方法是使用图像的掩模:

掩模:用选定的图像、图形或物体,对待处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。用于覆盖的特定图像或物体称为掩模或模板。光学图像处理中,掩模可以足胶片、滤光片等。数字图像处理中,掩模为二维矩阵数组,有时也用多值图像。数字图像处理中,图像掩模主要用于:①提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。②屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。③结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。④特殊形状图像的制作。

由上述的结果,可以看出用copyTo给图像加一个logo的方法:

首先将大图读入,存在src的Mat类对象中,然后将想做logo的图读入到wifiLogo的Mat类对象中,然后定义roi区域,方法是定义一个Mat类对象imageRoi,它的值是src中的一块大小和wifiLogo的区域,事实上imageRoi和src中的这块区域是共享内存的,然后将做logo的图像读入灰度图作为掩模mask,最后用wifiLogo.copyTo(imageRoi,mask),可以看到mask和wifiLogo是一张图片。只是mask是灰度图形式。然而这并不是我想讲的重点,重点是掩模的工作原理,你会发现在源码中我用了三个掩码,第一个是wifiLogo读入的灰度图,第二个是大小和wifiLogo一样大小的,且灰度值为0的,第三个是大小和wifiLogo一样大小的,且灰度值为1的,最后实验发现,第二种mask没能将wifiLogo拷贝到原图像中,可以想到,

wifiLogo.copyTo(imageRoi,mask);是根绝对应mask的像素值,如果某个像素的像素值为0,则不拷贝,反之则拷贝,以为wifiLogo和imageRoi和mask的尺寸都是一模一样的,
所以这样做可以把整个wifiLogo拷贝到imageRoi中而不会有遗漏。

猜你喜欢

转载自blog.csdn.net/qq_33485434/article/details/81016207