第一篇博客,希望共同进步,若有错误,望不吝赐教
一、xml文件
XML是指可扩展标记语言(extensible Markup Language),被设计用来传输和存储数据,存储时的组织结构层次分明,有点类似于树的组织形式,基本的组织形式为:
<元素名 属性名=“属性值”>
(contents)
<元素名 >
以元素名开头,同时以该元素名结束,形成一个完整的结构
<frame_rate>12</frame_rate>//这就是一个元素完整的定义,元素名为frame_rate,包含的内容是12这个数字
如果一个元素里面还包含了其他元素,那么称该元素为是父元素,被包含的元素被称之为子元素,子元素结构也遵循上面所说的结构(属性值有时候不一定有,但是元素名是必须的),为了更直观的理解,在下面贴上了结构图和代码。
//如下所示的就是一个元素相互嵌套的例子,父元素名为 Frame00003Target00000,包含有Type 、Position两种子元素
//Type存储的是一个字符串,Position存储的是一个由opencv定义的Mat2i类型的矩阵
<Frame00003Target00000>
<Type>"白色实线"</Type>
<Position type_id="opencv-matrix">
<rows>279</rows>
<cols>1</cols>
<dt>"2i"</dt>
<data>774 424 771 425 </data>
</Position>
</Frame00003Target00000>
所以说到这里,xml文档的组织形式个人觉得是很像树的结构。在理清楚了文档的组织结构之后,想要读取或者写xml文档思路就比较清晰了——>寻找你需要读的元素,然后按照名称索引。
二、下面结合具体例子讲一下如何使用opencv来进行读xml文件
1. 例子中要读取的xml文件为 “TSD-Lane-00054-Info.xml”,内容如下,第一步就是要定义一个FileStorage 的对象,
<?xml version="1.0" encoding="zh_CN.UTF-8"?>
<opencv_storage>
<frame_rate>12</frame_rate>
<camera_matrix type_id="opencv-matrix">
<rows>3</rows>
<cols>3</cols>
<dt>d</dt>
<data>
1.6509659734816685e+03 0. 6.4833853810658752e+02 0.
1.6444260810124783e+03 4.8158038566147854e+02 0. 0. 1.</data></camera_matrix>
<Frame00003Target00000>
<Type>"白色实线"</Type>
<Position type_id="opencv-matrix">
<rows>279</rows>
<cols>1</cols>
<dt>"2i"</dt>
<data>
774 424 771 425 </data></Position></Frame00003Target00000>
</opencv_storage>
xml文件
定义FileStorage对象fs,并初始化构造参数,分别是文件名,READ/Write(定义该对象是进行读操作还是写操作),编码格式:
FileStorage fs("TSD-Lane-00054-Info.xml", FileStorage::READ,String("zh_CN.UTF-8"));
2. 读取其中的内容(包括子元素)
上面的xml文件中包含了frame_rate,camera_matrix,Frame00003Target0000 这3个元素,前两个不包括子元素,所以读起来比较直接,>>是定义在FileStorage类中的运算符,可以直接实现输入的功能。
Mat kk=cvCreateMat(3,3,CV_64F);
fs["camera_matrix"] >> kk
int framerate = static_cast<int(fs["frame_rate"]);
由于Frame00003Target0000包含有Type 、Position两种子元素,为了访问这两个元素,我们需要定义一个节点FileNode对象:
FileNode node = fs["Frame00003Target00000"];
然后以从该节点向下访问:
string ss = (string)(node)["Type"];
Mat2i position;
(node)["Position"] >> position;
三、下面结合具体例子讲一下如何使用opencv来进行写xml文件
那么如何来写呢?既然XML文件有着鲜明的层级结构,所以在写的时候也应该层次分明,首先同样要创立一个新的xml文件(构造参数含义不变):
cv::FileStorage xmlFile(“TSD-Lane-00001-Result.xml”, cv::FileStorage::WRITE, String("zh_CN.UTF-8"));
那么我希望写一个拥有如下结构的xml文件该如何组织呢?
<Frame00003TargetNumber>1</Frame00003TargetNumber>
<Frame00003Target00000>
<Type>"白色实线"</Type>
<Position type_id="opencv-matrix">
<rows>279</rows>
<cols>1</cols>
<dt>"2i"</dt>
<data>774 424 771 425 </data>
</Position>
</Frame00003Target00000>
向一个元素中写入内容的基本格式为
xmlFile << 元素名 << 内容
如果该元素包含有子元素:
xmlFile << 父元素<< {
xmlFile << 子元素名1<<内容
xmlFile << 子元素名2<<内容
xmlFile << 父元素<< }
具体到例子就是:
xmlFile << "Frame00003TargetNumber"<< 1
xmlFile << Frame00003Target00000<< {
xmlFile << "Type"<<"白色实线"
xmlFile << "Position"<<P
xmlFile << Frame00003Target00000<< }
其中P就是定义个一个Vector(Point2i)类型的变量,存储的就是774 424 771 425 )
四、结语
这是我的第一篇博客,本着备份笔记,同时共享经验的初衷,认认真真的码出来的,如有不对的地方,请各位大神指出,我会谦虚受教。