C++ PNG图像未在OpenCV中正确加载

C++ PNG图像未在OpenCV中正确加载,c++,image,opencv,image-processing,C++,Image,Opencv,Image Processing,我正在使用下面的代码查看下图 (如果看不到图像,请右键单击上面的空格并保存图像.) 图像是32位的。 OpenCV显示白色图像。这是一个白色箭头图像,周围有alpha值 Mat img = imread("FordwardIcon.png", CV_LOAD_IMAGE_UNCHANGED | CV_LOAD_IMAGE_ANYDEPTH); cout << img.depth() << "\t" << img.channels() << end

我正在使用下面的代码查看下图

(如果看不到图像,请右键单击上面的空格并保存图像.) 图像是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);
Mat img=imread(“FordwardIcon.png”,CV_LOAD_IMAGE_UNCHANGED | CV_LOAD_IMAGE_ANYDEPTH);

不用担心,你的图像加载正确

问题更多的是,您希望imshow()尊重alpha通道(它没有)。

目前,Opencv(3.0)似乎无法加载具有透明度的png图像(也称为“alpha通道”)。要使用
cv::imread()
加载此类图像,您需要首先删除透明通道,并用一些颜色替换它

这可以通过Linux使用Imagemagick工具轻松完成。例如:

convert input.png -background '#00ff00' -flatten result.png
您可以使用
文件
工具检查图像是否有(或没有)。在您提供的图像上:

>$ file input.png 
给出:

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

给予


参见

但opencv说,通道=1和比特深度=8当我用coutoh打印时,像素值都接近255,到目前为止,我只能判断你的代码(看起来是正确的)。为什么不编辑并附加您的图像,以便人们可以尝试?图像已附加在第一行和第二行之间(但不可见)。右键单击并保存图像并对其进行测试。这是一张带有alpha通道的白色图像哦,好的。我得到了同样奇怪的值。困惑。我想问题是,图像是两个通道(1个灰度通道和1个alpha通道)。在gimp中创建RGBA图像并在opencv中阅读对我来说效果很好。Afaik OpenCV(或底层编解码器?!?)在写入png文件方面受到限制(仅3个通道),因此可能在某种程度上阅读也受到限制。正如米卡所建议的,看起来imread不支持2个通道的图像。@Canberk Baci Okay..你有关于如何在OpenCV中加载附加图像的信息吗OpenCV擅长处理图像,而不是读取图像。您需要一个合适的采集工具箱,如。您可以创建双通道Mat,使用windows SDK或libpng将图像读入数组;然后用手将数据推到Mat上。
CV\u LOAD\u IMAGE\u UNCHANGED
使用alpha通道加载png。正如另一个答案所指出的,是imshow造成了问题
>$ file result.png 
result.png: PNG image data, 52 x 32, 8-bit colormap, non-interlaced