这个是我自己做的粗略的螺旋丸的图,导出为png并带有alpha通道。

最后和一只狗合成成这个样子。

效果还是可以的。

为了实现这个效果,首先我们要明白具有透明通道的图片的OpenCV的读取方式。在OpenCV里,正常是读取图像和写入图像默认都是忽略透明通道的,如果想要读取原图像中的透明通道,则在使用imread()函数时,后面的参数要使用CV_LOAD_IMAGE_UNCHANGED参数或是直接写-1也可以。比如:

Mat inimg = imread("dog.png", CV_LOAD_IMAGE_UNCHANGED); // 读取透明通道  

// 输出RGBA数值  

cout << (int)inimg.at<Vec4b>(0,0)[0] << endl  

     << (int)inimg.at<Vec4b>(0,0)[1] << endl  

     << (int)inimg.at<Vec4b>(0,0)[2] << endl  

     << (int)inimg.at<Vec4b>(0,0)[3] << endl;  

这样我们读取的图片就有了四个通道,也就是BGRA四个通道,第四个就是Alpha通道,这个通道通过0-255的数值来代表该像素的透明度。

我通过split函数分解矩阵的通道把png图片分解为B1矩阵,G1矩阵,R1矩阵,A1矩阵把背景图片分解为了B0矩阵,G0矩阵,R0矩阵。于是叠加的结果:令alpha = A1 , 令beta = 255 - alpha。
#include <vector>  

#include <stdio.h>  

#include <opencv2/opencv.hpp>  

  

using namespace cv;  

using namespace std;  

  

int cvAdd4cMat_q(cv::Mat &dst, cv::Mat &scr, double scale);  

  

int main()  

{  

    char str[16];  

    Mat img1 = imread("bk.jpg"), img2 = imread("img.png", -1);  

    Mat img1_t1(img1, cvRect(0, 0, img2.cols, img2.rows));  

    cvAdd4cMat_q(img1_t1,img2,1.0);  

    imshow("final",img1);  

    waitKey(0);  

    return 0;  

}  

  

int cvAdd4cMat_q(cv::Mat &dst, cv::Mat &scr, double scale)    

{    

    if (dst.channels() != 3 || scr.channels() != 4)    

    {    

        return true;    

    }    

    if (scale < 0.01)    

        return false;    

    std::vector<cv::Mat>scr_channels;    

    std::vector<cv::Mat>dstt_channels;    

    split(scr, scr_channels);    

    split(dst, dstt_channels);    

    CV_Assert(scr_channels.size() == 4 && dstt_channels.size() == 3);    

  

    if (scale < 1)    

    {    

        scr_channels[3] *= scale;    

        scale = 1;    

    }    

    for (int i = 0; i < 3; i++)    

    {    

        dstt_channels[i] = dstt_channels[i].mul(255.0 / scale - scr_channels[3], scale / 255.0);    

        dstt_channels[i] += scr_channels[i].mul(scr_channels[3], scale / 255.0);    

    }    

    merge(dstt_channels, dst);    

    return true;    

}    
最终使用这个方法,可以到达前图的效果。

【计算机视觉】OPENCV对于有alpha通道的透明背景图片的读取和图片叠加的更多相关文章

  1. 【Unity Shaders】Transparency —— 使用alpha通道创建透明效果

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  2. OpenCV【2】---读取png图片显示到QT label上的问题

    问题一:   操作图片test.png是一个365x365的PNG图片   通过OpenCV自带的GUI显示出来图像是没问题的,例如以下操作代码所看到的: QStringfileName=QFileD ...

  3. php 处理透明背景的图片时的问题

    PHP图象处理之透明背景的gif和png图片的一些问题 1,直接读取有透明背景的PNG格式文件,然后直接输出,背景变成了黑色,gif则没有这种情况.   解决方法:使用 imagesavealpha ...

  4. 关于Opengl中将24位BMP图片加入�一个alpha通道并实现透明的问题

    #include <windows.h>#include <GL/glut.h>#include <GL/glaux.h>#include <stdio.h& ...

  5. 关于Opengl中将24位BMP图片加入一个alpha通道并实现透明的问题

    #include <windows.h>#include <GL/glut.h>#include <GL/glaux.h>#include <stdio.h& ...

  6. 什么是Alpha通道?

    图像处理(Alpha通道,RGB,...)祁连山(Adobe 系列教程)****的UI课程 一个也许很傻的问题,在图像处理中alpha到底是什么?  Alpha通道是计算机图形学中的术语,指的是特别的 ...

  7. ImagXpress中如何修改Alpha通道方法汇总

    ImagXpress支持处理Alpha通道信息来管理图像的透明度,Alpha通道支持PNG ,TARGA和TIFF文件,同时还支持BMP和ICO文件.如果说保存的图像样式不支持Alpha通道,就将会丢 ...

  8. 窗体的Alpha通道透明色支持(一旦 Form 被定义为利用 LayeredWindow ,窗口的绘图不再响应沿用多年的 WM_Paint 消息)

    参考: http://www.delphibbs.com/delphibbs/dispq.asp?lid=2190768 Windows 2000后,为了支持类似MAC界面的Alpha通道混合效果,提 ...

  9. Alpha通道

     Alpha通道是计算机图形学中的术语,指的是特别的通道,意思是“非彩色”通道,主要是用来保存选区和编辑选区.真正让图片变透明的不是Alpha 实际是Alpha所代表的数值和其他数值做了一次运算  为 ...

随机推荐

  1. AtCoder Beginner Contest 133

    目录 Contest Info Solutions A. T or T B.Good Distance C. Remainder Minimization 2019 D. Rain Flows int ...

  2. Hello 2019题解

    Hello 2019题解 题解 CF1097A [Gennady and a Card Game] map大法好qwq 枚举每一个的第\(1,2\)位判是否与给定的重复即可 # include < ...

  3. linux系列(二十):find命令

    1.命令格式 find pathname -options [-print -exec -ok ...] 2.命令功能 用于在文件树种查找文件,并作出相应的处理 3.命令参数 pathname: fi ...

  4. iptables一些练习

    iptables 一些小练习 可以参考之前的一起食用 https://www.cnblogs.com/lovesKey/p/10909633.html 允许来自192.168.0.0/16网段的地址来 ...

  5. (4)打造简单OS-loader硬盘加载和C++写入文件

    0.简要说明: 我们完全可以使用bochs创建映像文件,如https://blog.csdn.net/jadeshu/article/details/89046838   ,那么为什么还去用C++去模 ...

  6. windows2008服务器设置系统启动时程序自动运行

    设置windows服务器启动时自动运行程序,而且不需要用户登录,就可以启动 首先准备好,程序的启动脚本文件或运行文件,如:start.bat 通过系统计划任务实现 1.开始----管理工具-----任 ...

  7. Js 之cookie插件(jquery.cookie.js)

    一.代码 (function (factory) { if (typeof define === 'function' && define.amd) { // AMD define([ ...

  8. [TJOI2019]大中锋的游乐场——最短路+DP

    题目链接: [TJOI2019]大中锋的游乐场 题目本质要求的还是最短路,但因为有第二维权值(汽水看成$+1$,汉堡看成$-1$)的限制,我们在最短路的基础上加上一维$f[i][j]$表示到达$i$节 ...

  9. Nut和nuTilda【翻译】

    翻译自:CFD-online 帖子地址:http://www.cfd-online.com/Forums/openfoam-solving/72176-nut-nutilda.html phile: ...

  10. Linux开机、重启、和用户登录注销

    一. 关机&重启命令 基本介绍: shutdown shutdown –h now    :   表示立即关机 shutdown -h          : 表示1分钟后关机 shutdown ...