OpenCV-如何将灰度转换为颜色(CV_8UC3)?

问题描述 投票:0回答:1

我正在尝试将两个Mat对象添加在一起,但是遇到错误。

这是工作代码:

    Mat src1, src2, dst;

    /// Read image ( same size, same type )
    src1 = imread("lion.png");
    src2 = imread("bluebell.png");

    dst = src1 + 0.5 * src2;

    imshow("Blend", dst);

    waitKey(0);
    return 0;

src1src2都具有与CV_8UC3相同的类型。但是当我尝试这个时:

    Mat src1, src2, src3, dst;

    /// Read image
    src1 = imread("lion.png");
    src2 = imread("bluebell.png", IMREAD_GRAYSCALE);
    src2.convertTo(src3, COLOR_GRAY2RGB);

    cout << "src1.type " << src1.type() << endl;
    cout << "src2.type " << src2.type() << endl;
    cout << "src3.type " << src3.type() << endl;

    dst = src1 + 0.5 * src3;

    imshow("Blend", dst);

    waitKey(0);
    return 0;

这不起作用。因为src2src3都具有0类型,即CV_8U。但我希望src3具有类型16,即CV_8UC3(根据here)。此代码带来此错误:

OpenCV错误:输入参数的大小不匹配(该操作既不是'array op array'(其中数组具有相同的大小和相同的通道数),也不是'array op scalar',也不是'scalar op array' )in cv :: arithm_op

如何将灰度图像转换为精确类型为CV_8UC3的彩色图像?

c++ opencv colors type-conversion
1个回答
0
投票

您无法通过调用convertTo更改频道数。根据reference

所需的输出矩阵类型,或者更确切地说,由于数量的深度通道与输入的通道相同;如果rtype为负,则输出矩阵将具有与输入相同的类型。

[当矩阵具有一个灰度通道时,可以通过将[BGR]通道的这一分量放在新矩阵中,使用cv::merge创建3个通道图像:

src1 = imread("lion.png");
src2 = imread("bluebell.png", IMREAD_GRAYSCALE);    // one channel

src2.convertTo(src3, COLOR_GRAY2RGB);

cv::merge(std::vector<cv::Mat>{src3, src3, src3}, src3);
                            // blue, green,red    as output 3-channels mat
dst = src1 + 0.5 * src3;
© www.soinside.com 2019 - 2024. All rights reserved.