为什么OpenCV的convertTo函数无法工作?

14

我有一张图片,它有4个通道并且是以4 * UINT8格式存储的。

我想要将它转换成3通道的浮点型数据,我正在使用以下代码:

images.convertTo(images,CV_32FC3,1/255.0);

转换后,图片变成了浮点格式,但仍然有4个通道。如何在OpenCV中去除第四个(alpha)通道?

3个回答

22

就像 @AldurDisciple 提到的那样,Mat::convertTo() 旨在用于更改 Mat 的数据类型,而不是更改通道数量。

为了生效,您应该将其分为两个步骤:

cvtColor(image, image, CV_BGRA2BGR);       // 1. change the number of channels
image.convertTo(image, CV_32FC3, 1/255.0); // 2. change type to float and scale

1
您好,1/255.0是什么意思?它有什么用处? - user4584333
5
这里的 1/255.0 是一个比例因子,它将把取值范围在 [0, 255] 的数转换到 [0, 1]。请查看 Mat::convertTo() 的文档了解更多详情。 - herohuyongtao

2
函数convertTo的作用是专门用于更改Mat的数据类型。根据文档(链接)中所述,输出图像的通道数始终与输入图像相同。如果您想要更改数据类型并减少通道数,则应使用splitmergeconvertTo的组合。请注意保留HTML标签。
cv::Mat img_8UC4;

cv::Mat chans[4];
cv::split(img_8UC4,chans);

cv::Mat img_8UC3;
cv::merge(chans,3,img_8UC3);

cv::Mat img_32FC3;
img_8UC3.convertTo(img_32FC3);

另一种方法可能是自己重新编写算法,这很容易而且可能更有效率。

0

OpenCV的cvtColor函数允许您转换Mat的类型和通道数量。

void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )

这样做可以将一个有色的4通道转换为有色的3通道:

cvtColor(image, image, CV_BGRA2BGR, 3);

或者更有效的方法可能是使用mixChannels函数,如果您查看文档,它的示例显示了如何拆分通道。

然后,如果您真的想将其更改为特定类型:

image.convertTo(image,CV_32F);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接