Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在opencv中使用imwrite保存图像时,会写入所有黑色,但imshow显示正确 原始问题_C++_Opencv - Fatal编程技术网

C++ 在opencv中使用imwrite保存图像时,会写入所有黑色,但imshow显示正确 原始问题

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;

此示例代码将显示正确创建的图像,但将保存只有黑色像素的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;

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