为什么openCV的convertto功能不起作用?

时间:2014-03-04 13:59:57

标签: c++ opencv alpha-transparency

我的图片有4个频道,格式为4 * UINT8

我正在尝试将其转换为3通道浮点数,我正在使用此代码:

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

转换后,图像采用浮动格式,但仍有4个通道。如何摆脱OpenCV中的第4个(alpha)频道?

3 个答案:

答案 0 :(得分:12)

正如@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 :(得分:2)

函数convertTo旨在用于专门更改Mat的数据类型。如文档(link)中所提到的,输出图像的通道数始终与输入图像相同。

如果要更改数据类型减少频道数,则应使用splitmergeconvertTo的组合:< / p>

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);

另一种方法可能是自己重新编码算法,这非常简单,可能更有效。

答案 2 :(得分:0)

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

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

所以像这样会将彩色4通道转换为彩色3通道:

cvtColor(image, image, CV_BGRA2BGR, 3);

或者使用mixChannels function可能更有效率,如果您查看文档,其示例将显示如何拆分频道。

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

image.convertTo(image,CV_32F);