【问题标题】:C++ How to make transparent watermark using OpenCV?C++ 如何使用 OpenCV 制作透明水印?
【发布时间】:2021-04-28 11:36:17
【问题描述】:

我正在尝试以低不透明度使水印透明,但似乎只是将颜色设置为白色:

这是我使用的代码,顺便说一句,我在一些 website 中找到了

/////////////////// Blending Images (Making Alpha) ////////////////////////

int main()
{
    Mat img, img_bgra;
    string img_path = "res/test.png";

    img = imread(img_path);
    if (img.data == NULL)
    {
        cout << "Image is not loaded!" << endl;
        return -1;
    }

    cvtColor(img, img_bgra, ColorConversionCodes::COLOR_BGR2BGRA);
    vector<Mat> channels(4);
    split(img_bgra, channels);

    channels[3] = channels[3] * 0.1;

    merge(channels.data(), 4, img_bgra);

    imwrite("res/transparent.png", img_bgra);
    imshow("Image", img_bgra);
    waitKey(0);
    return 0;
}

我希望水印像这样显示:

我怎样才能做到这一点?

【问题讨论】:

    标签: c++ visual-studio opencv


    【解决方案1】:

    我不擅长 C++,所以我将尝试用 python 示例进行解释,希望这将足够可读以提供帮助

    alpha = 0.1  # maximum watermark opacity
    imageSource = cv2.imread("res/test.png")  # assuming BGR, uint8
    imageWatermark = cv2.imread("res/transparent.png")  # assuming BGRA, uint8
    
    maskWatermark = imageWatermark[:,:, 3]  # copy the alpha(transparency) channel, uint8
    maskWatermark = np.float32(maskWatermark)*(1/255)*alpha  # convert to float, normalize, apply transparency mul
    maskSource = 1 -maskWatermark  # float32, mask out the things we want to keep
    
    imageWatermark = cv2.cvtColor(imageWatermark, cv2.COLOR_BGRA2BGR)  # convert to same colorspace as source (3 channels), uint8
    
    imageResult = np.uint8( np.float32(imageSource)*maskSource 
                           +np.float32(imageWatermark)*maskWatermark))  # blend, convert to uint8
    cv2.imshow('result', imageResult)
    

    这里的重点是:

    • 需要某种掩码来判断水印的哪些像素是 会影响生成的图像
    • 混合就像两个颜色向量之间的插值,其中 不透明度就像 t 坐标一样;这是为每个对应的 两张图片的像素对
    • 仔细观察数据类型以避免溢出
    • 图像必须具有相同的尺寸;如果他们不是,你应该缩小 或以某种方式扩展它们。我认为水印很可能是 比图片小很多。在这种情况下,您可能需要复制 图像的水印部分(与水印尺寸匹配), 应用水印,然后复制带水印的片段

    【讨论】:

    • 谢谢,但是我Python不好,我不能把你的代码翻译成C++。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    相关资源
    最近更新 更多