- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用的程序正在读取一些位图,并需要 32FC1 个图像。
我正在尝试创建这些图像
cv::Mat M1(255, 255, CV_32FC1, cv::Scalar(0,0,0));
cv::imwrite( "my_bitmap.bmp", M1 );
但是当我检查深度时——它总是 CV_8U
如何创建文件以便它们包含正确的信息?
更新:如果我使用不同的文件扩展名也没关系 - 例如tif 或 png
我正在阅读它 - 使用已经实现的代码 - 使用 cvLoadImage
。
我正在尝试创建现有代码(检查图像类型)可以使用的文件。
我无法在现有代码中转换文件。现有代码不会尝试读取随机图像类型并将其转换为所需类型,而是检查文件是否属于所需类型。
我发现 - 谢谢你的回答 - cv::imwrite 只写整数类型的图像。
是否有另一种方式 - 使用 OpenCV 或其他方式 - 来编写图像,以便我最终得到 CV_32F 类型?
再次更新:读取图像的代码...如果进入 cv::Mat:
cv::Mat x = cv::imread(x_files, CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR);
现有代码:
IplImage *I = cvLoadImage(x_files.c_str(), CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR);
最佳答案
cv::imwrite() .bmp 编码器采用 8 位 channel 。
如果你只需要用 OpenCV 写 .bmp 文件,你可以将你的 32FC1 图像转换为 8UC4,然后使用 cv::imwrite()
来写它,你将得到每像素 32 位.bmp 文件。我猜您读取文件的程序会将 32 位像素解释为 32FC1。.bmp format没有明确的 channel 结构,每个像素只有一些位数。因此,您应该能够在 OpenCV 中将 32 位像素写入 4 个 8 位 channel ,并在另一个程序中将它们读取为单 channel 32 位像素 - 如果您这样做,您需要了解读者的字节顺序假设。像下面这样的东西应该工作:
cv::Mat m1(rows, cols, CV_32FC1);
... // fill m1
cv::Mat m2(rows, cols, CV_8UC4, m1.data); // provide different view of m1 data
// depending on endianess of reader, you may need to swap byte order of m2 pixels
cv::imwrite("my_bitmap.bmp", m2);
您将无法正确读取您在 OpenCV 中创建的文件,因为 OpenCV 中的 .bmp 解码器假定文件是 1 或 3 channel 的 8 位数据(即它无法读取 32 位像素)。
编辑
可能更好的选择是使用 OpenEXR格式,OpenCV 有一个编解码器。我假设您只需要使用 .exr 扩展名保存您的文件。
关于c++ - OpenCV 保存 CV_32FC1 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17735863/
我对函数的 OpenCV CV_* 常量有一些烦人的问题。我知道 OpenCV 最近摆脱了很多常量的 CV_,但是我找不到任何更新的文档。并且所有退出它的文档仍然显示旧常量。 例如,CV_BGR2GR
我是一名优秀的程序员,十分优秀!