C++中Mat类型与CSV、xml文件的存取转换

  • Post author:
  • Post category:其他


最近在做机器学习方面的项目,经常涉及到将矩阵数据存储在表格中,然后又将表格中的数据读取进程序的操作,在网上找过一些相关的代码,将Mat矩阵保存到CSV文件中,然后再将CSV文件中的表格数据读取为Mat类型的数据,但是大多数代码比较复杂,而且不易理解,这里将目前用到的最简单的Mat与CSV相互转换的代码分享一下,同时以备后用。


1.将opencv的Mat类型保存到CSV文件中

void saveMat(cv::Mat inputMat,char* filename)//将mat矩阵保存到CSV文件中
{
	FILE* fpt = fopen(filename,"w");
	int rows = inputMat.rows;
	int clos = inputMat.cols;
	for (int i = 0; i < rows;i++)
	{
		for(int j = 0;j<clos;j++)
		{
			if (j < clos-1)
				fprintf(fpt,"%f,",inputMat.at<float>(i,j));
			else
				fprintf(fpt,"%f\n",inputMat.at<float>(i,j));
		}
	}
	fclose(fpt);

}

2.将CSV文件读取为Mat类型

这里主要用到了opencv中的机器学习模块用于处理数据的一个函数read_csv(),这个函数是CvMLData的一个函数,通过它可以很容易地将CSV文件读取进来。

    // returns:
    // 0 - OK
    // -1 - file can not be opened or is not correct
    int read_csv( const char* filename );
</pre><pre name="code" class="html">将CSV读取进来进而转换成Mat类型的过程如下:
CvMLData mlData;
mlData.read_csv("test.csv");//读取csv文件
const CvMat* A;
A=mlData.get_values();
Mat data= Mat(A,true);
得到的data即为我们所需要的的Mat矩阵。
CvMLData在ml.h的头文件中,因而在使用的时候需要包含ml.h的头文件。另外值得注意的是,opencv的ml模块在opencv2和opencv3中区别比较大,2系列的opencv是支持CvMLData的,opencv3应该不支持这一函数,只是opencv3中有一个类似的数据类Data,
它有一个TrainData::loadFromCSV(file_name, headlinecont);也是具有类似的功能,可以自行阅读ml.h的头文件进行相应的改动。
<strong><span style="font-size:32px;">3.用xml文件来进行Mat文件的存取</span></strong>
因为编程最开始接触的数据存储文件是CSV表格,所以做项目的时候一直用的CSV表格来进行存取,有一阵子还被CSV弄得头疼得不行,但一直也没想过换种数据方式,今天突然发现似乎Mat与xml的转换比起CSV来更加简单。
Mat img_mat;
FileStorage fs("test.xml", FileStorage::WRITE);
fs<<"vocabulary"<<img;
fs.release();

(2)从xml中读取数据并存为mat。
FileStorage fsr("test.xml", FileStorage::READ);
Mat mat_vocabulary;
fsr["vocabulary"] >> mat_vocabulary;
fsr.release();

这种比起CSV表格的读取确实简单多了,但是有一个问题就是xml文件不能用excel打开,不方便进行程序外的编辑,这个是硬伤,

对于需要在程序外进行大量数据处理的情况显然是不现实的。





版权声明:本文为windforever2014原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。