c++ - cv::imwrite 不保存 CV_32FC4 cv::Mat

标签 c++ opencv

我正在尝试在 cv::Mat 中使用 CV_32FC4,以便它存储 RGBA32 图像。但是当我使用 cv::imwrite 将其保存为 png 文件时,结果文件始终是一个图像。

例如,我创建了这样一个图像:

   cv::Mat f4(50, 50, CV_32FC4);

   for (int i = 0; i < 50 * 50; ++i)
   {
      *(FLOAT4*)(f4.data + i * sizeof(FLOAT4)) = FLOAT4(i % 50 / 50.0f, i / 2500.0f, 0.0f, 1.0f);
   }  
   cv::imwrite("32FC4.png", f4); //"32FC4.png" will be an empty image file, 
                                 //size is 249 B, not white or black,
                                 //a transparent image.

最佳答案

您只能将 uchar/ushort 类型保存为 png,而不是 float 或 double。

使用:

Mat bgra8;
f4.convertTo(bgra8, CV_8UC4, some_scale_factor);
imwrite("my.png", bgra8);

如果您需要保持精度,并且您的 Mat 相当小,请使用 FileStorage,并写入一个文本文件:

FileStorage fs("my.yml",FileStorage::WRITE);
fs << "f4" << f4;
fs.release();

稍后,再读一遍:

Mat f4;
FileStorage fs("my.yml",FileStorage::READ);
fs["f4"] >> f4;

关于c++ - cv::imwrite 不保存 CV_32FC4 cv::Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27523995/

相关文章:

c++ - 为什么会崩溃?我如何解决它?

c++ - C++ 中的提升构造函数

c++ - 我可以通过不正确地使用指针分配和值更改来破坏我的操作系统吗?

opencv - 将不规则重新映射到规则网格

c++ - 如何从派生类访问基类中的重载运算符?

c++ - 确定 OpenCV 中矩阵的类型

Android 4.2 ndk : library loading crash: load_library(linker. cpp :750) || soinfo_link_image || libhoudini. 所以 ||打开简历

visual-studio - OpenCV 警告 : "function compiled as native"

python - Open CV导入不起作用

c++ - 带有 Boost 的 CMake 1.62.0 : "No Boost libraries were found"