编程技巧:使用opencv读写xml文档实例

                                               第一篇博客,希望共同进步,若有错误,望不吝赐教
一、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 )

四、结语

这是我的第一篇博客,本着备份笔记,同时共享经验的初衷,认认真真的码出来的,如有不对的地方,请各位大神指出,我会谦虚受教。

猜你喜欢

转载自blog.csdn.net/weixin_38907330/article/details/80763880