首页 > 解决方案 > cvtColor 忽略 dstCn 参数 OpenCV

问题描述

我正在尝试创建一个导入 RGB 图像并将其转换为灰度的程序。我希望输出图像由 3 个通道组成。为了实现这一点,我使用cv::cvtColordstCn参数设置为 3 的函数:

cv::Mat mat = cv::imread("lena.bmp");
std::cout << CV_MAT_CN(mat.type()) << "\n"; // prints "3", OK
cv::cvtColor(mat, mat, cv::COLOR_BGR2GRAY, 3);
std::cout << CV_MAT_CN(mat.type()) << "\n"; // prints "1" regardless of dstCn

但看起来dstCn没有考虑在内,输出数组只有1个通道。

OpenCV 文档说

dstCn - 目标图像中的通道数;如果参数为 0,则通道数由 src 和 code 自动得出。

这是一个非常基本的案例,我知道有很多解决方法,但我想知道这是一个错误还是我的不理解。

标签: c++opencv

解决方案


答案可以在 OpenCV 源代码中找到。让我们看一下imageproc/src/color.cpp文件中的cvtColor函数。有一个很长的开关盒,所以我只在这里发布最有趣的部分:

void cvtColor( InputArray _src, OutputArray _dst, int code, int dcn )
{
    ...
    switch( code )
    {
    ...
    case COLOR_BGR2GRAY: case COLOR_BGRA2GRAY:
    case COLOR_RGB2GRAY: case COLOR_RGBA2GRAY:
        cvtColorBGR2Gray(_src, _dst, swapBlue(code));
        break;
    }
}

我的问题中的代码使用COLOR_BGR2GRAY. 在 switch 语句之前没有做任何特别的事情。调用swapBlue也没有做任何有趣的事情。我们可以看到这种情况完全忽略了dcn(aka dstCn)。所以这似乎是完全故意的,我的想法从一开始就是错误的。

我还在OpenCV 论坛上发现了一个类似的帖子,其中Doomb0t指出:

灰度的概念是你有一个通道来描述在黑白之间渐变的强度。因此,尚不清楚为什么需要 3 通道灰度图像(...)


推荐阅读