我使用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.