将MATLAB中的mat数据转换为OpenCV能够读取的xml数据

在图像处理领域,有时我们需要将MATLAB中的程序移植到C平台上,这时最好的办法就是利用视觉图像处理库OpenCV来实现。然而,MATLAB中的mat数据我们无法直接读取到OpenCV工程中去,OpenCV只能读取xml型的数据,所以我们呢需要将mat型数据转换为xml型数据。

假如你有一个data.mat(11行,2列)数据,要把其转换为data.xml文件
具体步骤如下:
1.利用MATLAB打开data.mat数据

load data

将MATLAB中的mat数据转换为OpenCV能够读取的xml数据_第1张图片

2.在Matlab中将data变量中的数据写入一个txt文件中,假如为data.txt

dlmwrite(‘data.txt’,data);

将MATLAB中的mat数据转换为OpenCV能够读取的xml数据_第2张图片

3.然后利用MATLAB打开data.txt文档(双击data.txt),你会发现数据如图所示,行内每个数据之间都有一个逗号

将MATLAB中的mat数据转换为OpenCV能够读取的xml数据_第3张图片

4.将上图红色框中的数据复制到一个新的txt文件中(一定要在MATLAB打开的这个界面下复制data.txt中的数据),假如我们已经新建了一个sun.txt

将MATLAB中的mat数据转换为OpenCV能够读取的xml数据_第4张图片

5.将sun.txt中的逗号“,”全部用空格替换掉,最后保存sun.txt文件。

将MATLAB中的mat数据转换为OpenCV能够读取的xml数据_第5张图片

将MATLAB中的mat数据转换为OpenCV能够读取的xml数据_第6张图片

6.下面就可以利用C程序创建xml文件,并读取xml文件。

#include
#include
#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"<//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();

}


你可能感兴趣的:(opencv,MATLAB,xml)