我的图片有4个频道,格式为4 * UINT8
。
我正在尝试将其转换为3通道浮点数,我正在使用此代码:
images.convertTo(images,CV_32FC3,1/255.0);
转换后,图像采用浮动格式,但仍有4个通道。如何摆脱OpenCV中的第4个(alpha)频道?
答案 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)中所提到的,输出图像的通道数始终与输入图像相同。
如果要更改数据类型和减少频道数,则应使用split
,merge
和convertTo
的组合:< / 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);