昨天花了一整天时间弄了matlab中的xml文件生成到opencv中读取的程序。虽然花了不少精力在这种文件格式上面,但庆幸的是,还是成功了。
为什么要进行这两者之间的转换:最近在做关于双目视觉车辆定位的项目,要在opencv中处理不少Mat的数据,而这些数据主要来源于matlab中(我主要是opencv编程,有个博士师兄负责matlab中的数据处理),所以想到用xml文件进行中间的转换。当然,你也可以在opencv下配置相应的matlab—Mat头文件,若此,你要考虑matlab的版本(x64或者x86)和你的编译器版本(x86或x64),也是蛮头疼的。
xml文件定义:它是Extentsible Markup Language(可扩展标记语言)的缩 写,是一种可以用来创建自定义标记的标记语言。它没有标签集(tag set),也没有语法规则(grammatical rule),但 是它有句法规则(syntax rule)。 XML文档可以是有效的(valid),但并非一定要求有效。所谓有效文档是指其符合其文档类型定义(DTD)的文档。如果一个文档符合一个模式(schema)的规定 ,那么这个文档是”模式有效的(schema valid)”。
下面是我用matlab生成的相应opencv下能读的xml文件:
下面附上代码:
function createxml(name1,datatest1,name2,datatest2) % name是输入的文件名,datatest是matlab中的矩阵(一般都是float格式存储的)
xdoc=com.mathworks.xml.XMLUtils.createDocument('opencv_storage');
xroot=xdoc.getDocumentElement;
%========定义矩阵,写入xml
[m1,n1]=size(datatest1);
type=xdoc.createElement(name1);
xroot.appendChild(type);
type.setAttribute('type_id','opencv-matrix')
rows=xdoc.createElement('rows');
rows.appendChild(xdoc.createTextNode(sprintf('%d',m1)));
type.appendChild(rows);
cols=xdoc.createElement('cols');
cols.appendChild(xdoc.createTextNode(sprintf('%d',n1)));
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 ',datatest1)));
type.appendChild(data);
%=======结束写入
%========定义数组,写入xml
[m2,n2]=size(datatest2);
type=xdoc.createElement(name2);
xroot.appendChild(type);
type.setAttribute('type_id','opencv-matrix')
rows=xdoc.createElement('rows');
rows.appendChild(xdoc.createTextNode(sprintf('%d',m2)));
type.appendChild(rows);
cols=xdoc.createElement('cols');
cols.appendChild(xdoc.createTextNode(sprintf('%d',n2)));
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 ',datatest2)));
type.appendChild(data);
str=strcat(name1,'.xml');
xmlwrite(str,xdoc);
end
调用函数:
clc;
clear all;
data_1x9=[1,2,3,4,5,6,7,8,9];
data_3x3=[1,2,3;4,5,6;7,8,9];
createxml('Mat1x9',data_1x9,'Mat3x3',data_3x3);
主要定义了data_1x9和data_3x3的矩阵,然后将这两个矩阵存入xml文件中。
有一点需要注意的是:输出的xml文件第一行中xml version=”1.0”
encoding=”utf-8” 需要删去 encoding=”utf-8” 否则会出现opencv不可读的现象。要保留两个问号!另外:在用matlab调试代码的时候出现类似于“JAVA 数组维数超标”的提示,让我不禁发觉,matlab中的xml文件是用JAVA语言的,是一种网络格式的文件,这就是和opencv里面生成的xml的区别!opencv里面生成的xml文件是基于C++的。
从matlab中写xml文件,然后用opencv读出来,加上看相关资料,花了整整一天时间,但是今天却发现这个没有想象中的那么重要,有点遗憾,
遂写成blog与大家共享。
这是我入研究生以来的第一篇C博客,如果里面有什么写的不对的地方,望各位批评指正,多谢!
最后非常感谢:
(http://wzy2px.blog.sohu.com/242141572.html)公开的代码。
本文主要说明了xml文件属性和怎么从matlab里面生成opencv需要的xml文件格式的操作,对于matlab和opencv读写xml文件具体参看一下网页:
opencv读写xml:
(http://www.cnblogs.com/summerRQ/articles/2524560.html)
matlab读写xml:
(http://www.cnblogs.com/emituofo/archive/2011/11/06/2238219.html)