FileStorage函数学习记录
前言,笔者在阅读开源代码时,遇到忘记的opencv提供的对文件操作的函数FileStorage,特此记录学习。
1.XML和YAML的简介
XML,即eXtensible Markup Language(可扩展标识语言)。是一种元标记语言。
元标记语言是开发者可以根据自身需要定义自己的标记。YAML,是一个可读性高,用来表达资料序列的格式。
注: .yml和 .yaml同为YAML格式的后缀名
2.了解FileStorage 类
FileStorage是OpenCV中XML和YAML文件的储存类,封装了所有相关的信息。它是OpenCV从文件中读数据或向文件中写数据事必须要使用的一个
类。
FileStorage构造函数
不带参数:
FileStorage()
带参数:
FileStorage(const String& source, int flags, const String& encoding=String());
参数解释:
const String& source:要打开的文件的源名或要从中读取数据的文本字符串;
文件名(.xml、.yml/.yaml或.json)决定其格式(分别为XML、YAML或JSON)
int flags:操作模式,例如下面的:读取,写入,追加等
FileStorage::READ = 0, //读取
FileStorage::WRITE = 1, //写入
FileStorage::APPEND = 2, //追加(在文件末尾追加)
FileStorage::MEMORY = 4, //从源读取数据或将数据写入内部缓冲区(即<由FileStorage::Release返回)
const String& encoding=String():编码文件的编码。请注意,目前不支持UTF-16 XML编码,并且应该使用8位编码。
举个例子:
写:
带参数:
FileStorage fs("a.mxl",FileStorage::WRITE);//用写入的模式打开a.mxl文件
不带参数:
FileStorage fs;
fs.open("a.xml",FileStorage::WRITE);
读:
FileStorage fs("a.xml",FileStorage::READ)//用写入的模式打开a.mxl文件
FileStorage fs;
fs.open("a,xml",FileStorage::READ);
(2)进行文件读写操作
①文本数字的输入和输出
写入:
fs<<"iterationNr"<<100;
在fs里写入iterationNr值为100
这里要解释以下xml文件的结构
- xml文件结构
①xml文件的第一行为xml文件说明,一般说明了xml的版本和编码信息;
如图中的
<? xml version="1.0" ?>
②xml文件的第二行为xml的起始节点,也是根节点;具体根节点的意思可自行百度了解,这里就不多赘述。
Opencv的xml文件默认的根节点为:
<opencv_storage>……</opencv_storage>
③每个xml文件有且只有一个根节点,其他节点都包含在这个根节点之内,每个节点又可以包含若干个子节点。
蓝色框内就是子节点
总截图为:
读取:
int itNr;
fs[“iterationNr”]>>itNr;
itNr =(int) fs[“iterationNr”];
此处以Mat数据类型为例:
②OpenCV数据结构的输入和输出
//数据结构初始化
Mat R = Mat_::eye(3,3);
Mat T = Mat_::zeros(3,1);
//向Mat中写入数据
fs << “R” << R;
fs << “T” << T;
//从Mat中读取数据
fs[“R”] >> R;
fs[“T”] >> T;
(3)vector(arrays)和maps的输入和输出
对于vector结构的输入和输出,要注意在第一个元素前加‘ [ ’,在最后一个元素前加上
‘ ] ’。
对于map结构的操作,使用的符号是‘ { ’ , ‘ } ’。
(4)文件关闭
文件关闭操作会在FileStorage类销毁时自动进行,但我们也可显式调用其析构函数FileStorage::release()实现。FileStorage::release()函数会析构掉FileStorage类对象
例如:
fs.rellease();
总结:FileStorage是OpenCV中对XML和YAML文件进行操作的存储类,可以对文件进行读入,写入,追加,值得注意的是Mat存入的结构的矩阵形式。