C++ 在opencv中使用imwrite保存图像时,会写入所有黑色,但imshow显示正确 原始问题
此示例代码将显示正确创建的图像,但将保存只有黑色像素的png。Mat为CV_32FC3格式,因此有3个浮动通道 我发现回答的问题涉及图像处理问题、错误转换或使用各种压缩方式以jpeg格式保存C++ 在opencv中使用imwrite保存图像时,会写入所有黑色,但imshow显示正确 原始问题,c++,opencv,C++,Opencv,此示例代码将显示正确创建的图像,但将保存只有黑色像素的png。Mat为CV_32FC3格式,因此有3个浮动通道 我发现回答的问题涉及图像处理问题、错误转换或使用各种压缩方式以jpeg格式保存 #include "opencv2/highgui/highgui.hpp" #include <iostream> using namespace std; using namespace cv; int main() { int i = 0; int j = 0;
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
int i = 0;
int j = 0;
Vec3f intensity;
cv::Mat imageF;
imageF= cv::Mat::zeros(36,36,CV_32FC3);
for(j=0;j<imageF.cols;++j){
for(i=0;i<imageF.rows;++i){
intensity = imageF.at<Vec3f>(j, i);
intensity.val[2] = 0.789347;
intensity.val[1] = 0.772673;
intensity.val[0] = 0.692689;
imageF.at<Vec3f>(j, i) = intensity;
}}
imshow("Output", imageF);
imwrite("test.png", imageF);
waitKey(0);
return 0;
}
#包括“opencv2/highgui/highgui.hpp”
#包括
使用名称空间std;
使用名称空间cv;
int main()
{
int i=0;
int j=0;
Vec3f强度;
cv::Mat imageF;
imageF=cv::Mat::Zero(36,36,cv_32FC3);
对于(j=0;j,您可以在:
imwrite函数将图像保存到指定的文件中。图像
根据文件扩展名选择格式(有关详细信息,请参阅imread()
扩展名列表)。在这种情况下,仅8位(或16位无符号(CV_16U))
适用于PNG、JPEG 2000和TIFF)单通道或3通道(带“BGR”
频道顺序)可以使用此功能保存图像。如果,
深度或通道顺序不同,请使用Mat::convertTo(),然后
cvtColor()以在保存前对其进行转换
您应该使用convertTo
将CV_32FC3
转换为CV_8UC3
,以获得相同的结果:
Mat3b imageF_8UC3;
imageF.convertTo(imageF_8UC3, CV_8UC3, 255);
imwrite("test.png", imageF_8UC3);
顺便说一下,imshow()
显示正确,因为
- 如果图像是8位无符号的,它将按原样显示
- 如果图像是16位无符号或32位整数,则像素除以256。也就是说,值范围[0255*256]映射到
[0255]
- 如果图像是32位浮点,则像素值乘以255。也就是说,值范围[0,1]映射到
[0255]。
基本上,写之前需要做的就是同样的技巧。我来问这个问题,因为我对黑色“.png”图像也有问题。最终我意识到,我的32位带通道(红色、绿色、蓝色、Alpha)的图像有一个零值Alpha通道(完全透明)。因此,了解透明度的程序只显示“图像后面的黑色背景”。将透明度更改为“255”(无透明度)后,我保存的png图像可以很好地可视化:
MyImage[:,:,3]=255
您可以通过指定值127来检查该行为,您将获得图像的淡/灰色版本
Mat3b imageF_8UC3;
imageF.convertTo(imageF_8UC3, CV_8UC3, 255);
imwrite("test.png", imageF_8UC3);