opencv处理透明图片

来源:互联网 发布:数控西门子802d编程 编辑:程序博客网 时间:2024/05/20 18:01

opencv处理透明图片

本文由 @lonelyrains出品,转载请注明出处。
文章链接: http://blog.csdn.net/lonelyrains/article/details/50389034

opencv处理透明图片,主要是考虑图片的叠加。

//主函数操作...Mat dest,srcAlpha;// imread后一个参数为-1表示读取带有alpha通道的图片srcAlpha = imread("C:\\Users\\Administrator\\Desktop\\1.png",-1);dest= imread("C:\\Users\\Administrator\\Desktop\\1.png");// 表示从dest的第(50,100)设置对srcAlpha的叠加mapToMat(srcAlpha, dest, 50, 100);...void mapToMat(const cv::Mat &srcAlpha, cv::Mat &dest, int x, int y){    int nc = 3;    int alpha = 0;    for (int j = 0; j < srcAlpha.rows; j++)    {        for (int i = 0; i < srcAlpha.cols*3; i += 3)        {            // 目的图片为三通道,所以是三通道的遍历、四通道的源图            // i/3*4表示第i/3个像素的位置             // i/3*4 + 3表示本像素的alpha通道的值            alpha = srcAlpha.ptr<uchar>(j)[i / 3*4 + 3];            //alpha = 255-alpha;            if(alpha != 0) //4通道图像的alpha判断            {                for (int k = 0; k < 3; k++)                {                    // if (src1.ptr<uchar>(j)[i / nc*nc + k] != 0)                    if( (j+y < dest.rows) && (j+y>=0) &&                        ((i+x*3) / 3*3 + k < dest.cols*3) && ((i+x*3) / 3*3 + k >= 0) &&                        (i/nc*4 + k < srcAlpha.cols*4) && (i/nc*4 + k >=0) )                    {                        dest.ptr<uchar>(j+y)[(i+x*nc) / nc*nc + k] = srcAlpha.ptr<uchar>(j)[(i) / nc*4 + k];                    }                }            }        }    }}

处理前
这里写图片描述

处理后这里写图片描述

本代码段所在的完整工程见另一篇博客 大家一起过圣诞

0 0
原创粉丝点击