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加载?

你不能像前面说的那样使用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;

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

OpenCV没有写/读浮点数图像的功能。来自cv::imwrite manual:

仅8位(PNG、JPEG 2000和TIFF为16位)单通道或3通道(具有"BGR"通道顺序)图像可以使用此函数保存。

您可以使用opencv Mat img= imread(filename, CV_LOAD_IMAGE_ANYDEPTH);加载浮动图像

尝试@berak解决方案,但得到"Missing, between elements"异常。正如这个bug报告中所述,在写入操作之后必须释放FileStorage对象,否则它将无法正确地完成文件写入,从而引发该异常。那么,更正后的代码应该是:

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.

相关内容

  • 没有找到相关文章

最新更新