如何正确将 cv::Mat 转换为 CV_8UC1?

Posted

技术标签:

【中文标题】如何正确将 cv::Mat 转换为 CV_8UC1?【英文标题】:How to correctly convert cv::Mat to CV_8UC1? 【发布时间】:2015-02-10 10:49:44 【问题描述】:

我在谷歌上搜索了很多关于这个问题的信息,但我无法解决。 所以,我应该将 16 位 3 通道图像转换为 8 位 1 通道图像。我在cv::inpaint 函数中使用这个二进制图像。 maskBGR,只有两种颜色——黑色和白色,是我的源图像。 所以,有代码:

Mat mask;
maskBGR.convertTo(mask, CV_8UC1);
inpaint(image, mask, dst, 8, cv::INPAINT_TELEA);

在那之后我的程序崩溃了。那是在命令行中写的:

OpenCV Error: Unsupported format or combination of formats (The mask must be
8-bit 1-channel image) in unknown function, file ..\..\..\src\opencv\modules\
photo\src\inpaint.cpp, line 747

inpaint.cpp 第 747 行:

if( CV_MAT_TYPE(inpaint_mask->type != CV_8UC1 )
   CV_ERROR( CV_StsUnsupportedFormat, "The mask must be 8-bit 1-channel image" );

我做错了什么?

【问题讨论】:

【参考方案1】:

convertTo()只改变频道类型,不改变频道数量。

对于 8 位 3 通道,它会是:

cvtColor(maskBGR, mask, CV_BGR2GRAY);

如果你的 maskBGR 真的是 16 位,3 个通道,你需要 2 个步骤:

maskBGR.convertTo(maskBGR, CV_8U);
cvtColor(maskBGR, mask, CV_BGR2GRAY);

【讨论】:

以上是关于如何正确将 cv::Mat 转换为 CV_8UC1?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 中的 CV_8UC1 到 CV_32FC1 的转换

如何将多个(超过 4 个)`CV::Mat` 图像`Size(M, N), CV_8UC1` 加入到一个 RGBA 图像中?

将打开的cv mat转换为整数数组

open cv mat怎样将数据类型转化为double

如何在不复制数据的情况下将 cv::Mat 转换为 2d std::vector

cv::Mat 对象中的空数据字段