在图像处理领域,有时我们需要将MATLAB中的程序移植到C平台上,这时最好的办法就是利用视觉图像处理库OpenCV来实现。然而,MATLAB中的mat数据我们无法直接读取到OpenCV工程中去,OpenCV只能读取xml型的数据,所以我们呢需要将mat型数据转换为xml型数据。
假如你有一个data.mat(11行,2列)数据,要把其转换为data.xml文件
具体步骤如下:
1.利用MATLAB打开data.mat数据
load data
2.在Matlab中将data变量中的数据写入一个txt文件中,假如为data.txt
dlmwrite(‘data.txt’,data);
3.然后利用MATLAB打开data.txt文档(双击data.txt),你会发现数据如图所示,行内每个数据之间都有一个逗号
4.将上图红色框中的数据复制到一个新的txt文件中(一定要在MATLAB打开的这个界面下复制data.txt中的数据),假如我们已经新建了一个sun.txt
5.将sun.txt中的逗号“,”全部用空格替换掉,最后保存sun.txt文件。
6.下面就可以利用C程序创建xml文件,并读取xml文件。
#include<opencv2/opencv.hpp>
#include<iostream>
#include "fstream"
using namespace cv;
using namespace std;
#define MAXLENGTH 1000000
float tmpf[MAXLENGTH];
void createxml( char* filename, int rows, int cols ); //创建xml文件
void readxml( char* filename, Mat& dst); //读取xml文件
void main()
{
char filename[100];
memset( filename, 0, 100);//清空
strcpy (filename,"sun");
int rows=11, cols=2; //数据的大小
createxml( filename, rows, cols ) ;
//把xml文件中的数据读取到Mat型的data矩阵中
Mat data;
memset( filename, 0, 100);//清空
strcpy (filename,"sun");
readxml( filename, data );
}
void createxml( char* filename, int rows, int cols )
{
//读取filename.txt中的数据,并存取到filename.xml文件中
char FileName[100];
strcpy( FileName,filename);
const char* type = ".txt";
strcat( FileName,type);
fstream file;
file.open( FileName, ios::in );
if(!file)
cout<<"file not founded"<<endl;
//int tmp[length];
int pos = 0;
while(!file.eof())//是否到文件结尾
{
file>>tmpf[pos];
pos++;
if( pos>=MAXLENGTH )
break;
}
file.close();
CvMat *Data=cvCreateMat( rows, cols, CV_32FC1 ); //CV_32FC1表示float型,这里的设置取决于filename.txt中的数据类型
cvInitMatHeader( Data, rows, cols , CV_32FC1, tmpf);
char Name[100];
strcpy( Name,filename);
strcat( Name,".xml");
cvSave( Name, Data );
cvReleaseMat( &Data );
}
void readxml( char* filename, Mat& dst)
{
//读取filename.xml文件中数据到Mat型的dst矩阵中
char FileName[100];
strcpy( FileName,filename);
const char* type = ".xml";
strcat( FileName,type);
FileStorage fs( FileName, FileStorage::READ);
if (!fs.isOpened())
{
cerr << "failed to open " << FileName << endl;
}
fs[filename]>>dst;
fs.release();
}