OpenCV FileStorage类读写XML/YML文件

本文转自:http://www.cnblogs.com/summerRQ/articles/2524560.html

在OpenCV程序中,需要保存中间结果的时候常常会使用.xml / .yml文件,opencv2.0之前都是使用C风格的代码,当时读写XML文件分别使用函数cvLoad()和cvSave()。在2.0以后的OpenCV转为支持C++,这一举措大大减少了代码量以及编程时需要考虑的细节。

新版本的OpenCV的C++接口中,imwrite()和imread()只能保存整数数据,且需要以图像格式。当需要保存浮点数据或者XML/YML文件时,之前的C语言接口cvSave()函数已经在C++接口中被删除,代替它的是FileStorage类。这个类非常的方便,封装了很多数据结构的细节,编程的时候可以根据统一的接口对数据结构进行保存。

1. FileStorage类写XML/YML文件

•   新建一个FileStorage对象,以FileStorage::WRITE的方式打开一个文件。

•   使用 << 操作对该文件进行操作。

•   释放该对象,对文件进行关闭。

例子如下:

 1 FileStorage fs("test.yml", FileStorage::WRITE);
 2     fs << "frameCount" << 5;
 3     time_t rawtime; time(&rawtime);
 4     fs << "calibrationDate" << asctime(localtime(&rawtime));
 5     Mat cameraMatrix = (Mat_<double>(3,3) << 1000, 0, 320, 0, 1000, 240, 0, 0, 1); //又一种Mat初始化方式
 6     Mat distCoeffs = (Mat_<double>(5,1) << 0.1, 0.01, -0.001, 0, 0);
 7     fs << "cameraMatrix" << cameraMatrix << "distCoeffs" << distCoeffs;
 8
 9     //features为一个大小为3的向量,其中每个元素由随机数x,y和大小为8的uchar数组组成
10     fs << "features" << "[";
11     for( int i = 0; i < 3; i++ )
12     {
13         int x = rand() % 640;
14         int y = rand() % 480;
15         uchar lbp = rand() % 256;
16         fs << "{:" << "x" << x << "y" << y << "lbp" << "[:";
17         for( int j = 0; j < 8; j++ )
18             fs << ((lbp >> j) & 1);
19         fs << "]" << "}";
20     }
21     fs << "]";
22     fs.release();

2. FileStorage类读XML/YML文件

FileStorage对存储内容在内存中是以层次的节点组成的,每个节点类型为FileNode,FileNode可以使单个的数值、数组或者一系列FileNode的集合。FileNode又可以看做是一个容器,使用iterator接口可以对该节点内更小单位的内容进行访问,例如访问到上面存储的文件中"features"的内容。步骤与写文件类似:

•   新建FileStorage对象,以FileStorage::READ 方式打开一个已经存在的文件

•   使用FileStorage::operator []()函数对文件进行读取,或者使用FileNode和FileNodeIterator

•   使用FileStorage::release()对文件进行关闭

例子如下:

 1     FileStorage fs("test.yml", FileStorage::READ);
 2
 3     //方式一: []操作符
 4     int frameCount = (int)fs["frameCount"];
 5
 6     //方式二: FileNode::operator >>()
 7     string date;
 8     fs["calibrationDate"] >> date;
 9
10     Mat cameraMatrix2, distCoeffs2;
11     fs["cameraMatrix"] >> cameraMatrix2;
12     fs["distCoeffs"] >> distCoeffs2;
13
14     //注意FileNodeIterator的使用,似乎只能用一维数组去读取里面所有的数据
15     FileNode features = fs["features"];
16     FileNodeIterator it = features.begin(), it_end = features.end();
17     int idx = 0;
18     std::vector<uchar> lbpval;
19     for( ; it != it_end; ++it, idx++ )
20     {
21         cout << "feature #" << idx << ": ";
22         cout << "x=" << (int)(*it)["x"] << ", y=" << (int)(*it)["y"] << ", lbp: (";
23         (*it)["lbp"] >> lbpval;  //直接读出一维向量
24
25         for( int i = 0; i < (int)lbpval.size(); i++ )
26             cout << " " << (int)lbpval[i];
27         cout << ")" << endl;
28     }
29     fs.release();

另外,注意在新建FileStorage对象之后,并以READ或WRITE模式打开文件之后,可以用FileStorage::isOpened()查看文件状态,判断是否成功打开了文件。

时间: 2024-10-07 20:29:21

OpenCV FileStorage类读写XML/YML文件的相关文章

利用opencv的FileStorage类实现XML/YAML文件的读写

FileStorage是opencv2.0以后专门用来读写XML/YAML文件的类,标准的C++实现.利用好XML文件可以极大地方便我们对中间数据的处理. 官方文档: (1) http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/core/file_input_output_with_xml_yml/file_input_output_with_xml_yml.html#fileinputoutputxmlyaml (2) htt

NHibernate生成实体类、xml映射文件

最近工作电脑装完win10后,之前使用的codeSmith安装不了,索性自己写一个. 界面比较简单,如下图: 第一行为Oracle数据库的连接字符串.连接成功后,填充表到第4行的下拉列表中. 第二行为实体类命名空间. 第三行为保存生成类.xml文件选择文件夹. 1 private void btnConnect_Click(object sender, RoutedEventArgs e) 2 { 3 try 4 { 5 using (OracleConnection conn = new Or

用 Qt 中的 QDomDocument类 处理 XML 文件(上)

我们可以看到,如果所要读取的XML文件不是很大,采用DOM读取方法还是很便捷的,由于我用的也是DOM树读取的方法,所以,本文所介绍的也主要是基于DOM的方法读取. 根据常用的操作,我简单的把对XML的操作分为以下几类: 1 首先对XML文件进行操作,打开文件. 这个其实就是对文件进行操作,可以把它直接定义为构造函数,在对对象进行初始化时完成. TopoDataReader::TopoDataReader(const wstring &filePath):_filePath(filePath),_

使用FileSystem类进行文件读写及查看文件信息

使用FileSystem类进行文件读写及查看文件信息 在这一节我们要深入了解Hadoop的FileSystem类--这是与与hadoop的文件系统交互的重要接口.虽然我们只是着重于HDFS的实现,但我们在编码时一般也要注意代码在FileSystem不同子类文件系统之间的可移植性.这是非常有用的,比如说你可以非常方便的直接用同样的代码在你的本地文件系统上进行测试. 使用hadoop URL读数据 从hadoop文件系统中读取文件的最简单的方法之一便是使用java.net.URL对象来打开一个欲从中

ASP.NET读写XML文件

本文中的方式主要是用序列化与反序列化的方式来实现读写xml文件,注意,不是特指的web.config文件,是指自定义的config文件. 下面的是一个xml读写操作类,包含读方法用到了反序列化方式,还有写方式,用到了序列化方式. using System; using System.IO; using System.Web; using System.Xml.Serialization; namespace WX_Tools { /// <summary> /// Xml文件读写类 /// &

C#中XmlTextWriter读写xml文件详细介绍

XmlTextWriter类允许你将XML写到一个文件中去.这个类包含了很多方法和属性,使用这些属性和方法可以使你更容易地处理XML.为了使用这个类,你必须首先创建一个新的XmlTextWriter对象,然后你可以将XML片断加入到这个对象中.这个类中包含了不少的方法用于将各种类型的XML元素添加到XML文件中,下表给出了这些方法的名字和描述情况: 方法 描述 WriteStartDocument 书写版本为"1.0"的 XML 声明 WriteEndDocument 关闭任何打开的元

Qt读写三种文件,QSettings读ini配置文件,QJsonDocument读JSON文件,QDomDocument读xml文件

第一种INI配置文件 .ini 文件是Initialization File的缩写,即初始化文件. 除了windows现在很多其他操作系统下面的应用软件也有.ini文件,用来配置应用软件以实现不同用户的要求.一般不用直接编辑这些.ini文件,应用程序的图形界面即可操作以实现相同的功能.它可以用来存放软件信息,注册表信息等. 读INI文件 INI文件内容如下: [conn] ip=127.0.0.1 port=8080 databaseversion=QSQLITE databasename=st

使用dom4j 读写xml文件

dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,同时它也是一个开放源代码的软件. String fileName="D:\\version.xml"; File inputXML=new File(fileName); //使用 SAXReader 解析 XML 文档 version.xml SAXReader saxReader=new SAXReader();

C++通过TinyXML类库读写XML文件

TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译.这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树. DOM模型即文档对象模型,是将整个文档分成多个元素(如书.章.节.段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系. 使用之前,需要先下载TinyXML类库:http://download.csdn.net/detail/tennysonsky.也可在sourceforge上下载