您的位置:首页 > 编程语言 > MATLAB

matlab生成opencv需要的xml文件

2015-09-24 17:52 435 查看
昨天花了一整天时间弄了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文件:



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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml opencv matlab 编程