cv::imwrite 不保存CV_32FC4 cv::Mat
cv::imwrite doesn't save CV_32FC4 cv::Mat
我正在尝试在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,而不能保存浮点数或双精度型。
用:
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;
这对于一些遇到相同问题的人可能很有用。
如果您尝试保存浮点垫(例如CV_32FC4或CV16FC4),以便检查存储在图像中的值,然后,您可以将其另存为.tiff文件
cv::imwrite("<fliename_32FC4>.tiff", <Mat_name>)
并使用您喜欢的图像编辑器(例如 Gimp)打开它。这比具有>1000 像素的 Mat 对象的文本文件更易于查看和解释。
在 Gimp 中,选择"窗口>可停靠对话框>指针"以查看所选像素的通道值。您可能需要告诉 Gimp 如何解释第四个通道,例如"非预乘 alpha 通道"。如果第 4 个通道中的值远非 1.0,则调整 Alpha 通道的color_curve,以使图像可见。
相关文章:
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 概念中的cv限定符需要表达式参数列表
- 将CHW格式的浮点向量转换为cv::Mat
- 错误的cv::face FacemarkLBF实例化
- 如何检查给定的参数是否为 cv::noArray()?
- 开放 CV 中的动态内存分配,用于视频处理
- 如何在 opencv 中使用 cv::VideoCapture::waitAny()
- 错误:未定义对cv::cudacodec::createVideoReader的引用
- OpenCV 3.4.1 error readNetFromTensorflow 无法在 cv::d nn::ReadProtoFromBinaryFile 中打开 .pb
- C++:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 将 cv::mat 转换为 QImage
- Inference pytorch C++ with alexnet and cv::imread image
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用
- cv::Normalise() 中的 L2_NORM 和 NORM_MINMAX 实现有什么区别?
- 将 cv::Mat 转换为 std::vector 的通用函数
- OpenCV undefined reference to 'cv::imread(cv::String const&, int)'
- 在 QML VideoOutput 中将 cv::mat 显示为 QVideoFrame
- 如何应用带有cv::cuda和C++的Canny Edge检测器?
- cv::connectedComponents vs cv::findContours 的实现和速度差异