保存和读取XML和YMAL文件
除图像数据之外,有时程序中尺寸较小的Mat矩阵、字符串、数组也需要进行保存
这些数据通常保存成XML文件或者YAML文件
XML是一中元标记语言
示例:
用<age>24</age>来表示age数据为24
<color>
<red>100</red>
<blue>150</blue>
</color>
来表示color数据中有两个名为red和blue的数据
数值分别为100和150
XML文件扩展名是“.xml”
YMAL是一种以数据为中心的语言
通过“变量:数值"的形式来表达每一个数据的数值,通过缩进来表示不同数据之间的结构和隶属关系
扩展名为".ymal"或".yml"
OpenCV提供了FileStorage类来生成和读取XML文件和YMAL文件
FileStorage()函数原型
FileStorage::FileStorage(const String & filename,
int flags,
const String & encoding = String()
)
- filename:打开的文件的名称
- flags:对文件进行的操作类型标志
- encoding:编码格式,目前不支持UTF-16 XML编码,需使用UTF-8 XML编码
FileStorage()构造函数中对文件操作类型常用标志
| 标志参数 | 简记 | 作用 |
|---|---|---|
| READ | 0 | 读取文件中的数据 |
| WRITE | 1 | 向文件中重新写入数据,会覆盖之前的数据 |
| APPEND | 2 | 向文件中继续写入数据,新数据在原数据之后 |
| MEMORY | 4 | 将数据写入或者读取到内部缓存区 |
FileStorage类可以通过isOpened()函数判断是否打开文件,成功返回ture,否则返回false
FileStorage类需要通过open()函数进行单独声明
open()函数原型
virtual bool FileStorage::open(const String & filename,
int flags,
const String & encoding = String()
)
- filename:打开的文件名称
- flags:对文件进行的操作类型标志,与 “FileStorage()构造函数中对文件操作类型常用标志” 一样
- encoding:编码格式,目前不支持UTF-16 XML编码,需使用UTF-8 XML编码
打开文件后,可以通过"<<" 将数据写入文件,或通过">>"从文件中读取数据
还可以通过FileStorage类的write()函数将数据写入文件
write()函数原型
void FileStorage::write(const String & name,
int val
)
- name:写入文件中的变量名称
- val:变量值
FileStorage类中提供了多个write()重载函数,分别用于实现将double、String、Mat、vector\
使用操作符将数据写入文件时与write()函数相似
例如:变量名:age,变量值:24 可以通过 file<<"age"<<24 实现
如果数据为数组,可以用"[]"将属于同一个变量值标志出来
例如: file << "age" <<"["<<24<<25<<"]"
如果某些变量隶属某个变量,可以用"{}"来表示比变量的隶属关系
例如:file << "age" <<"{"<<"Xiaoming"<<24<<"Wanghua"<<25<<"}"
读取数据时,只需要通过变量名就可以读取变量值
例如:file[x] >> xRead 是读取变量名为x的变量值
但变量有多个数据或子变量时,就要通过FileNode节点类型和迭代器FileNodeIterator进行读取
如果某个变量是一个数组,需要定义一个形如 file[”age“]的FileNode节点变量,通过迭代器遍历数据
示例:
FileNode fileNode = file["age"];
//使用迭代器遍历数据
for (FileNodeIterator i = fileNode.begin(); i != fileNode.end(); i++)
{
float a;
*i >> a;
cout << a << " ";
}
cout << endl;