我正在尝试在 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/