因为opencv不支持阿尔法通道(也有的说最新版本的其实是支持了的,在此我不做肯定),但要是两张图片去叠加的话,其实还是可以简单实现透明叠加的,这也是制作水印图片的方法。
比如,我们把图片B叠加到图片A上.透明的实际效果就是既能看到A的内容,又能看到B的内容.
终值 = Va*(1-rank/10)+Vb*(rank/10)
///下边是关键代码,有注释
//先说一下,pimg是大图(也可以理解为背景图),watermarkpic是水印图片(你的水印logo,或者文字),是IplImage格式指针
//注意数组的越界问题,水印图片要比pimg的小才行的。如果大了,就缩小一下就可以了
//把水印图片的像素值写到pImg的ROI中 CvScalar scalar1,scalar2,scalar3; //透明度参数 double dbAlpha; //1-10,0为不透明,10为透明(也就是不显示水印图片),所以实际值为1-9 dbAlpha = 2; for (int i=0;iheight;i++) { for (int j=0;j width;j++) { //得到水印图片对应的值 //这其实也可以设置一下透明度的 hyaline //scalar=cvGet2D(watermarkpic,i,j);//这行是完全不透明的语句 scalar1 = cvGet2D(watermarkpic,i,j);//水印图片像素值 scalar2 = cvGet2D(pImg,i,j);//pimg像素值 for (int k =0;k<4;k++) { //开始赋值,也就是合成后图片对应的像素值 scalar3.val[k] = scalar1.val[k]*(1-dbAlpha)+scalar2.val[k]*dbAlpha; } cvSet2D(pImg,i,j,scalar3); } }
下边附3张效果图:
最后,感谢美女范冰冰小姐的友情客串.
ps:图片来自截屏软件,就有添加透明水印的效果哦,可自定义水印位置哈:http://www.youthtribe.com/snapshot/
对了,示例图片的左下角的【透明度】,没错,中文,也是用opencv实现的,哈哈!