原文地址:http://blog.csdn.net/wzy1990/article/details/8508662
遇到一个问题,需要将matlab中的矩阵用OpenCV打开。故尝试了下在matlab中编辑.xml文件,用opencv中的cvLoad调用。
首先用opencv自带函数生成一个.xml文件
- double a[9]={2,2,3,4,5,6,1,2,2};
- CvMat *testmat=cvCreateMat(3,3,CV_64FC1);
- cvInitMatHeader(testmat,3,3,CV_64FC1,a);
- cvSave("my.xml",testmat);
打开后格式为
- <?xml version="1.0"?>
- <opencv_storage>
- <my type_id="opencv-matrix">
- <rows>3</rows>
- <cols>3</cols>
- <dt>d</dt>
- <data>
- 2. 2. 3. 4. 5. 6. 1. 2. 2.</data></my>
- </opencv_storage>
在matlab中编写文件,用xmlwrite生成.xml文件
- function createxml(name,datatest) % name是输入的文件名,data是matlab中的矩阵(一般都是float格式存储的)
- xdoc=com.mathworks.xml.XMLUtils.createDocument(‘opencv_storage');
- xroot=xdoc.getDocumentElement;
- %
- [m,n]=size(datatest);
- type=xdoc.createElement(name);
- xroot.appendChild(type);
- type.setAttribute(‘ type_id',’ opencv-matrix')
- %
- rows=xdoc.createElement(’ rows');
- rows.appendChild(xdoc.createTextNode(sprintf('%d',m)));
- type.appendChild(rows);
- cols=xdoc.createElement(‘ cols');
- cols.appendChild(xdoc.createTextNode(sprintf('%d',n)));
- type.appendChild(cols);
- dt=xdoc.createElement(‘ dt');
- dt.appendChild(xdoc.createTextNode(sprintf('%s',’ f')));
- type.appendChild(dt);
- data=xdoc.createElement(’ data');
- data.appendChild(xdoc.createTextNode(sprintf('%f ',datatest)));
- type.appendChild(data);
- str=strcat(name,‘ .xml');
- xmlwrite(str,xdoc);
- end
输出的xml文件第一行<?xml version="1.0" encoding="utf-8"?> 需要删去 encoding="utf-8" 否则会出现opencv不可读的现象。
此时的xml便可以直接用opencv读出了---
测试:
matlab: data=[1,2,3,4,5,6,7,8,9]; createxml(’ test',data)
opencv:
- CvMat* testmat=(CvMat*)cvLoad("test.xml");
- for (int i=0;i<3;i++)
- {
- for (int j=0;j<3;j++)
- {
- cout<<cvGetReal2D(testmat,i,j)<<" ";
- }
- cout<<endl;
- }
显示结果:
特别要注意,这尼玛有坑,matlab存yml文件,是讲矩阵列方向存储,opencv读取数据,是行方向读取,直接读出来,数据是对不上的。Orz