我正在尝试在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.
答案 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;