在opencv中创建透明图像

Posted

技术标签:

【中文标题】在opencv中创建透明图像【英文标题】:Create a transparent image in opencv 【发布时间】:2015-09-02 10:22:59 【问题描述】:

我正在尝试像this 一样在 x、y 和 z 轴上旋转图像。 旋转时不应裁剪图像所以我在做this

Mat src = imread("path");
int diagonal = (int)sqrt(src.cols*src.cols+src.rows*src.rows);
int newWidth = diagonal;
int newHeight =diagonal;

Mat targetMat(newWidth, newHeight, src.type());

我正在创建一个更大的图像 targetMat。输入图像是 png 图像。 但我希望这张图片是透明图片。所以我尝试了this

Mat targetMat(newWidth, newHeight, src.type(), cv::Scalar(0,0,0,0));

但是输出的图片是

我需要的是(透明图在这里)

那么我需要做些什么改变呢?

【问题讨论】:

问题是,您的输入图像类型为CV_8UC3,但您需要CV_8UC4 才能使用alpha 通道。所以在创建新垫子之前尝试Mat targetMat(newWidth, newHeight, CV_8UC4, cv::Scalar(0,0,0,0));或src的cvtColor @Micka 那我该怎么办?因为我的输入图像不是 CV_8UC4。在初始化 Mat 时,我无法将 src.type() 行更改为 CV_8UC4,因为我正在尝试旋转输入图像。我可以做 cvtColor( src,dst, CV_BGR2BGRA ); ??? 我试过 cvtColor(src,src, CV_BGR2BGRA);但给出错误... 您的输入图像有 Alpha 通道?查看 imread 标志,有一个标志可以以原始类型和颜色加载图像,而不是一直读取为 8UC3。如果您的输入图像文件没有 alpha 通道,请使用带有 BGR2BGRA 标志的 cvtColor @Micka 错误来自代码的其他部分。我也在尝试将此图像混合到视频中。错误将来自这部分。发表您的评论作为答案,以便我批准。 :) 【参考方案1】:

问题是,您的输入图像类型为CV_8UC3,但您需要CV_8UC4 才能使用alpha 通道。所以在创建新垫子之前尝试Mat targetMat(newHeight, newWidth, CV_8UC4, cv::Scalar(0,0,0,0));或src的cvtColor

要使用您的原始图像,有两种可能性:

    使用 cv::cvtColor(src, src, CV_BGR2BGRA)(并调整后面的代码以使用 4 通道矩阵 - cv::Vec4b 而不是 cv::Vec3b 等)

    如果您的输入文件是带有 alpha 通道的 .png,您可以使用 CV_LOAD_IMAGE_ANYDEPTH(希望这是正确的)标志将其加载为 CV_xxC4 图像(也可能是 16 位)并使用原始 alpha 值。

【讨论】:

带有这个标志 CV_LOAD_IMAGE_ANYDEPTH 。我们可以在Png上添加Alpha通道吗?目前,如果我使用标志 CV_LOAD_IMAGE_UNCHANGED 然后在 png 上添加 Alpha 通道,我会在 png 上获得蓝色背景

以上是关于在opencv中创建透明图像的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenCV 中创建二维矩阵数组?

在 Python 中使用 OpenCV 从随机数组中创建 RGB 图片

如何使用 Java 的 openCV 中创建的 FaceRecognizer 库?

在 Java 客户端中创建 Mat 对象,使用 opencv 从 C++ 服务器发送

OpenCV 模板匹配和透明度

OpenCV创建矩阵,每行包含多个图像