cv :: imwrite不保存CV_32FC4 cv :: Mat

时间:2014-12-17 10:58:16

标签: c++ opencv

我正在尝试在CV_32FC4中使用cv::Mat,因此它会存储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.

1 个答案:

答案 0 :(得分:1)

你只能将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;