在OpenCV中,PNG图像无法正确加载。

4
我正在使用下面的代码查看以下图像。

This

(如果您无法看到图像,请右键单击上面的空白处并保存图像..) 该图像为32位。 OpenCV显示为白色图像。 它是一个带有其周围alpha值的白色箭头图像。

Mat img = imread("FordwardIcon.png", CV_LOAD_IMAGE_UNCHANGED | CV_LOAD_IMAGE_ANYDEPTH);
cout << img.depth() << "\t" << img.channels() << endl;
imshow("img", img);
waitKey(0);

请告诉我如何正确地加载图片。


1
我猜问题在于图像是双通道的(1个灰度通道和1个alpha通道)。在gimp中创建RGBA图像并在opencv中读取对我来说很好用。据我所知,OpenCV(或底层编解码器?!)在写入png文件时有限制(仅3个通道),因此可能在某种程度上也受到读取的限制。 - Micka
1
看起来 imread 不支持2通道图像,正如 Micka 所建议的那样。 - baci
@Canberk Baci 好的..您有关于如何在OpenCV中加载附加的图像的输入吗? - Vinoj John Hosan
OpenCV擅长处理图像,但不擅长读取它们。您需要一个适当的获取工具箱,例如http://libpng.org/pub/png/libpng.html。您可以创建两个通道的Mat,使用Windows SDK或libpng将图像读入数组;然后手动将数据推送到Mat中。 - baci
2个回答

3

目前,Opencv(3.0)似乎无法加载带有透明度(即“alpha通道”)的png图像。要使用cv :: imread()加载这些类型的图像,您需要首先删除透明通道,并替换为某种颜色。

在Linux上,可以使用Imagemagick工具轻松完成此操作。例如:

convert input.png -background '#00ff00' -flatten result.png

您可以使用 "file" 工具检查图片是否具有它(或不具有)。在您提供的图片上:
>$ file input.png 

提供:

input.png: PNG image data, 52 x 32, 8-bit gray+alpha, non-interlaced

当...时
>$ file result.png 

提供

result.png: PNG image data, 52 x 32, 8-bit colormap, non-interlaced

请参见http://www.imagemagick.org/script/convert.php

"CV_LOAD_IMAGE_UNCHANGED"可以加载带有Alpha通道的png。正如其他答案指出的那样,它是imshow导致问题的原因。 - PhilLab

3

不要担心,您的图片已经正确加载。

问题在于您期望imshow()函数能够支持alpha通道(实际上它并不支持)。


但是OpenCV显示通道数为1,位深度为8。当我使用cout<<img打印时,像素值几乎全部为255...但原始图像是32位(通过Windows属性查看)。 - Vinoj John Hosan
哦,迄今为止我所能判断的就是你的代码(看起来是正确的)。为什么不编辑并附上你的图像,这样大家就可以尝试它了呢? - berak
图片已经附加在第一行和第二行之间(但不可见)。右键单击并保存图像,然后进行测试。这是一个带有 alpha 通道的白色图像。 - Vinoj John Hosan
1
哦,好的。我也得到了相同的奇怪值。感到困惑。 - berak

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