在用opencv进行图片操作时,经常涉及到对矩阵的操作。由于本人常需要把矩阵进行本地保存和读取,如果直接用文件操作会比较麻烦,本文总结了以下对csv文件进行读写的操作。
1.读取CVS文件
opencv中的CvMLData可以实现对csv文件的读取,注意CvMLData包含在ml.h头文件中,所以需要添加#include “ml.h”采用使用。 CvMLData类的官方API介绍如下链接
http://docs.opencv.org/2.4/modules/ml/doc/mldata.html?highlight=cvmldata#cvmldata-read-csv
使用示例:
CvMLData mlData;
mlData.read_csv("test.csv");//读取csv文件
cv::Mat data= cv::Mat(mlData.get_values(),true);
通过以上三行代码就可以把cvs文件中的矩阵读取到data矩阵中。注意,最后一行代码用cv::Mat()就行转换是因为CvMLData::get_values()返回的是CvMat类型的矩阵。
2.保存cv::Mat矩阵为csv文件
opencv可以通过CvMLData来读取csv文件,但是遗憾的是opencv不能直接把Mat矩阵存储为csv文件。鉴于此本人自己写了一个保存Mat矩阵为csv文件的函数。代码如下
void saveMat(cv::Mat inputMat,char* filename)
{
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);
}
该函数有两个参数,一个是将保存的Mat矩阵,一个是保存的文件名。如要保存上面的data矩阵为data.csv文件,则可以使用saveMat(data,”data.csv”)。
通过以上两种方式就可以轻松对opencv中的Mat矩阵进行读取和保存了。