1、XML和YAML文件简介

XML文件是一种元标记语言,即开发者可以根据自身需要定义自己的标记。它是一种语义和结构语言,描述了文档的语义和结构

YAML以数据为中心,是一个可读性高,用来表达资料序列的格式。.yml和.yaml为YAML文件的后缀名。

YAML试图用一种比XML更敏捷的方式来完成XML所完成的任务。


2、FileStorage类操作文件

一般使用如下过程来写入或者读取数据到XML或YAML文件中

(1)实例化一个FileStorage类的对象,用默认带参数的构造函数完成初始化,或者用FileStorage::open()成员函数辅助初始化

(2)使用流操作符<<进行文件写入操作,或者>>进行文件读取操作

(3)使用FileStorage::release()函数析构掉FileStorage类对象,同时关闭文件


下边对2中三个步骤进行示例讲解

【第一步】XML、YAML文件的打开

(1)准备文件写操作

FileStorage是OpenCV中XML和YAML文件的存储类,封装了所有相关的信息。是OpenCV从文件中读取数据向文件中写入数据时必须要使用的一个类。

构造函数为FileStorage::FIleStorage,有两个重载:

FIleStorage::FileStorage()
FIleStorage::FileStorage(const string& source, int flags, const string& encoding=string())

对于第一种不带参数的构造函数,可以使用成员函数FileStorage::open进行数据写操作:

FileStorage fs;
fs.open("abc.xml", FileStorage::WRITE);

对于第二种带参数的构造函数,进行写操作:

fs.open("abc.xml", FileStorage::WRITE);

(2)准备文件读操作

采用FileStorage::READ标识符进行读操作:

第一种方式:

fs.open("abc.xml", FileStorage::READ);

第二种方式:

FileStorage fs;
fs.open("abc.xml", FileStorage::READ);

上边操作是以XML文件为例子的,对于YAML文件同样适用。


【第二步】进行文件读写操作

(1)文本和数字的输入和输出

定义好FileStorage类对象之后,写入文件可以使用“<<”运算符,如

fs<<“iterationNr”<<100

读取文件,使用“>>”运算符,如:

int inNr;
fs["iterationNr"]>>itNr;
itNr = (int)fs["iterationNr"];

(2)OpenCV数据结构的输入和输出

OpenCV数据结构的输入和输出和基本的C++形式相同,如:

//手数据结构的初始化
Mat R = Mat_<uchar>::eye(3, 3);
Mat T = Mat_<double>::zeros(3, 1);//向Mat中写入数据
fs << "R" << R;
fs << "T" << T;//从Mat中读取数据
fs["R"] >> R;
fs["T"] >> T;

【第三步】vector(arrays)和maps的输入和输出

对于vector结构的输入和输出,注意需要在一个元素前加上“[”,在最后一个元素前加上“]”,如:

fs << "string" << "[";  //开始读入string文本序列
fs << "imagel.jpg" << "Awesomeness" << "baboon.jpg";
fs << "]";  //关闭序列

对于maps结构的操作,使用的符号是“{”“}”,如:

fs << "mapping";  //开始读入mapping文本
fs << "{" << "One" << 1;
fs << "Two" << 2 << "}";

读取这些结构时,会用到FileNode和FileNodeIterator数据结构。FileStorage类的“[”、“]”操作符会返回FileNode数据类型;对于一连串的node,可以使用FileNoelIterator结构,如:

FileNode n = fs["strings"];   // 读取字符串序列以得到节点
if(n.type() != FileNode::SEQ)
{cerr << "发生错误!字符串不是一个序列!" << endl;return 1;
}FileNodeIterator it = n.begin(), it_end = n.end();   //遍历节点
for(; it != it_end; ++it)cout << (string)*it << endl;

【第四部】文件关闭

文件关闭会在FileStorage类销毁时自动关闭,但也可显示调用其析构函数FileStorage::release()实现。

析构函数FileStorage::release()会析构掉FileStorage类对象,同时关闭文件。

调用过程:

fs.release();

示例程序

【1】示例程序:XML和YAML文件的写入

//---------------------------------【头文件、命名空间包含部分】-------------------------------
//      描述:包含程序所使用的头文件和命名空间
//------------------------------------------------------------------------------------------------
#include "opencv2/opencv.hpp"
#include <time.h>
using namespace cv;//-----------------------------------【main( )函数】--------------------------------------------
//  描述:控制台应用程序的入口函数,我们的程序从这里开始
//-----------------------------------------------------------------------------------------------
int main()
{//初始化FileStorage fs("test.yaml", FileStorage::WRITE);//开始文件写入fs << "frameCount" << 5;time_t rawtime; time(&rawtime);fs << "calibrationDate" << asctime(localtime(&rawtime));  //写入当前系统时间Mat cameraMatrix = (Mat_<double>(3, 3) << 1000, 0, 320, 0, 1000, 240, 0, 0, 1);Mat distCoeffs = (Mat_<double>(5, 1) << 0.1, 0.01, -0.001, 0, 0);fs << "cameraMatrix" << cameraMatrix << "distCoeffs" << distCoeffs;fs << "features" << "[";for (int i = 0; i < 3; i++){int x = rand() % 640;int y = rand() % 480;uchar lbp = rand() % 256;fs << "{:" << "x" << x << "y" << y << "lbp" << "[:";for (int j = 0; j < 8; j++)fs << ((lbp >> j) & 1);fs << "]" << "}";}fs << "]";fs.release();printf("\n文件读写完毕,请在工程目录下查看生成的文件~");getchar();return 0;
}

运行结果为:

生成的文件

【2】示例程序:XML和YAML文件的读取

//---------------------------------【头文件、命名空间包含部分】-------------------------------
//      描述:包含程序所使用的头文件和命名空间
//------------------------------------------------------------------------------------------------
#include "opencv2/opencv.hpp"
#include <time.h>
# include <string>
using namespace cv;
using namespace std;int main()
{//初始化FileStorage fs2("test.yaml", FileStorage::READ);// 第一种方法,对FileNode操作int frameCount = (int)fs2["frameCount"];string date;// 第二种方法,使用FileNode运算符> > fs2["calibrationDate"] >> date;Mat cameraMatrix2, distCoeffs2;fs2["cameraMatrix"] >> cameraMatrix2;fs2["distCoeffs"] >> distCoeffs2;cout << "frameCount: " << frameCount << endl<< "calibration date: " << date << endl<< "camera matrix: " << cameraMatrix2 << endl<< "distortion coeffs: " << distCoeffs2 << endl;FileNode features = fs2["features"];FileNodeIterator it = features.begin(), it_end = features.end();int idx = 0;vector<uchar> lbpval;//使用FileNodeIterator遍历序列for (; it != it_end; ++it, idx++){cout << "feature #" << idx << ": ";cout << "x=" << (int)(*it)["x"] << ", y=" << (int)(*it)["y"] << ", lbp: (";// 我们也可以使用使用filenode > > std::vector操作符很容易的读数值阵列(*it)["lbp"] >> lbpval;for (int i = 0; i < (int)lbpval.size(); i++)cout << " " << (int)lbpval[i];cout << ")" << endl;}fs2.release();//程序结束,输出一些帮助文字printf("\n文件读取完毕,请输入任意键结束程序~");getchar();return 0;
}

运行结果为:

【OpenCV】OpenCV实战从入门到精通之 -- 输入输出XML和YAML文件详解相关推荐

  1. OpenCV之core 模块. 核心功能(2)基本绘图 随机数发生器绘制文字 离散傅立叶变换 输入输出XML和YAML文件 与 OpenCV 1 同时使用

    基本绘图 目的 本节你将学到: 如何用 Point 在图像中定义 2D 点 如何以及为何使用 Scalar 用OpenCV的函数 line 绘 直线 用OpenCV的函数 ellipse 绘 椭圆 用 ...

  2. 《OpenCV3编程入门》学习笔记5 Core组件进阶(六)输入输出XML和YAML文件

    第5章 Core组件进阶 5.6 输入输出XML和YAML文件 5.6.1 XML和YAML文件 XML和YAML是使用非常广泛的文件格式,可以利用XML或者YAML式的文件存储和还原各种数据结构,还 ...

  3. 利用opencv中的类FileStorage生成和读取XML和YAML文件

    有时候程序中的变量值.字符串.数组等数据也需要独立于源代码本身保存,这个时候就需要用到XML和YAML文件进行保存. OpenCV4提供了用于生成和读取XML文件和YAML文件的类FileStorag ...

  4. Redis从入门到精通之底层数据结构快表QuickList详解

    文章目录 0.前言 1. 快表的结构 2. Redis 6.0 快表quicklist 基本结构 2.1 成员变量 2.1 主要操作 2.1 推导结果 3. 快表的操作 3. 快表的优缺点 3.1 优 ...

  5. 【Python】Python实战从入门到精通之二 -- 教你使用Python中列表操作

    本文是Python实战–从入门到精通系列的第二篇文章: [Python]Python实战从入门到精通之一 – 教你深入理解Python中的变量和数据类型 Python实战从入门到精通之二 – 教你使用 ...

  6. Opencv——写入或读取数据到XML或YAML文件

    什么是XML.YAML文件 XML(eXtensible Markup Language)是一种元标记语言.所谓"原标记",就是开发者可以根据自身需要定义的标记,任何满足XML命名 ...

  7. 【Python】Python实战从入门到精通之六 -- 教你读取文件

    本文是<Python实战从入门到精通>系列之第6篇 [Python]Python实战从入门到精通之一 -- 教你深入理解Python中的变量和数据类型 [Python]Python实战从入 ...

  8. 【Python】Python实战从入门到精通之五 -- 教你使用文件写入

    本文是<Python实战从入门到精通>系列之第5篇 [Python]Python实战从入门到精通之一 -- 教你深入理解Python中的变量和数据类型 [Python]Python实战从入 ...

  9. OpenCV XML和YAML文件的文件输入和输出

    OpenCV XML和YAML文件的文件输入和输出 XML和YAML文件的文件输入和输出 目标 源代码 解释 XML / YAML文件打开和关闭. 文本和数字的输入和输出. OpenCV数据结构的输入 ...

最新文章

  1. Android --- 新版本取色器吸管工具点击无效,没反应
  2. Py之cupy:cupy的简介、安装、使用方法之详细攻略
  3. JSONP的原理与实现(基于jQuery)
  4. 获取对象的属性,并且判断对象属性是否存在
  5. 找到的程序集清单定义与程序集引用不匹配
  6. Centos7访问本地电脑共享文件夹遇到的问题
  7. vivo手机充电慢还耗电
  8. Python yaml模块
  9. 移动端页面兼容性问题解决方案整理
  10. Javascript第六章JavaScript字面量加数组创建对象第三课
  11. 决策树归纳一般框架(ID3,C4.5,CART)
  12. 电脑蓝牙在哪里打开_华为手机与华为Matebook笔记本如何通过蓝牙传输文件
  13. C Primer Plus(第6版)第一章复习题答案
  14. CWE-476: NULL Pointer Dereference(空指针间接引用)
  15. VLAN隔离葵花宝典(二)
  16. 数据库表结构及索引设计
  17. 直接管理和维护计算机系统的程序称为,全国2008年04月自学考试计算机原理试题及答案.doc...
  18. 免费帝国CMS发布插件
  19. Java项目:医院挂号预约管理系统(java+SSM+HTML+JavaScript+jsp+mysql)
  20. Android pdf填充表单,预览,图片填充,水印添加

热门文章

  1. c malloc 头文件_C/C++求职者必备 23 道面试题,一道试题一份信心!
  2. php和apache协同,apache和php之间协同工作的配置经验分享
  3. python 表情包 gif_几行 python 代码合成 gif / 微信表情~与恶意合成软件说再见【文末附代码】...
  4. 开关电源中的磁性元件书籍_总结丨PFC开关电源的效率优化措施
  5. 华为云 mysql 主备_安全性能两手抓,华为云MySQL“非双一特性”助力企业业务稳定高效运行...
  6. windows2016安装.netFramework 3.5
  7. html5 mask,HTML5 Canvas渐进填充与透明实现图像的Mask效果
  8. micropython中文社区-micropython支持中文啦!
  9. 基于SOA的图书商城系统分析
  10. 产品质量不过关怎么办?一招帮你大幅提高生产质量