我使用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加载的相同图像?
答案 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.