c++ - cvtColor 忽略 dstCn 参数 OpenCV
问题描述
我正在尝试创建一个导入 RGB 图像并将其转换为灰度的程序。我希望输出图像由 3 个通道组成。为了实现这一点,我使用cv::cvtColor
了dstCn
参数设置为 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个通道。
dstCn - 目标图像中的通道数;如果参数为 0,则通道数由 src 和 code 自动得出。
这是一个非常基本的案例,我知道有很多解决方法,但我想知道这是一个错误还是我的不理解。
解决方案
答案可以在 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 通道灰度图像(...)
推荐阅读
- sql - 如何使用虚拟列执行 SQL-INSERT/UPDATE
- javascript - Javascript Vimeo 上传 api 没有给我实时上传偏移值
- r - 通过 R Enviroment 的非冗余残差对解决方案进行 EFA 比较:如何计算/提取它们
- c# - 以毫秒变化运行循环
- nginx - 使用 set_by_lua_file 传递变量
- reactjs - Reducer 返回两次,第二次返回 undefined
- java - Selenium 无头模式很少测试失败,使用 AjaxElementLocatorFactory 并出现 NoSuchElementException
- python - 创建基本的简单树
- azure-devops - 如何在 Azure Pipeline 上使用 Terraform 将文件上传到 Azure 存储?
- element - 这个元素叫什么?