OpenCV和使用浮点数据读取图像

时间:2013-03-08 07:56:21

标签: opencv

我使用OpenCV来读取图像。然后我使用Matlab加载相同的图像。 然后我显示图像。对于OpenCV加载的图像,图像内部没有图像,只有灰色平面。对于Matlab加载的图像,它具有我想要的图像。 图像像素值是非常小的浮点数据,如0.0021。我用来加载图片的代码如下所示。

`Mat image(IMAGE_ROW, IMAGE_COL, CV_64FC3);
Mat  gray(IMAGE_ROW, IMAGE_COL, CV_64FC1);
image = imread(filespath, CV_LOAD_IMAGE_COLOR );// Read the file
cv::imshow("Image", image);
cvtColor( image, gray, CV_BGR2GRAY, 1);
cv::imshow("gray", gray);`

为什么我不能拥有Matlab加载的相同图像?

4 个答案:

答案 0 :(得分:6)

如前所述,你不能用imwrite()/ imread()做到这一点。

但您可以使用FileStorage保存/加载浮点Mats,如下所示:

Mat fm = Mat::ones(3,3,CV_32FC3); // dummy data

FileStorage fs("my.yml", FileStorage::WRITE );
fs << "mat1" << fm;  //choose any key here, just be consistant with the one below

并回读:

Mat fm;
FileStorage fs("my.yml", FileStorage::READ );
fs["mat1"] >> fm;

答案 1 :(得分:2)

在调用cv::Mat之前,您无需显式初始化cv::imread图像,它会根据所读取图像的大小和格式正确初始化图像。因此,使用(IMAGE_ROW, IMAGE_COL, CV_64FC3)初始化图像并不重要。

OpenCV没有写入/读取浮点图像的功能。来自cv::imwrite手册:

  

仅8位(在PNG,JPEG 2000和TIFF的情况下为16位)   单通道或3通道(带'BGR'通道顺序)图像可以   使用此功能保存。

答案 2 :(得分:1)

您可以使用opencv Mat img= imread(filename, CV_LOAD_IMAGE_ANYDEPTH);

加载浮动图像

答案 3 :(得分:0)

尝试@berak解决方案,但在元素之间得到了一个&#34;缺失&#34;例外。如this错误报告中所述,您必须在编写操作后释放FileStorage对象,否则将无法正确完成文件写入,从而引发该异常。然后,修正后的codelet版本应为:

Mat fm = Mat::ones(3,3,CV_32FC3); // dummy data
FileStorage fs("my.yml", FileStorage::WRITE );
fs << "mat1" << fm;  //choose any key here, just be consistant with the one below
fs.release(); //Release the file and finish the writing.