保存和读取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;

results matching ""

    No results matching ""