opencv学习(十七)之XML和YAML文件读写操作

本文介绍了OpenCV中XML和YAML文件的读写操作,包括FileStorage类的使用、FileNode节点操作和FileNodeIterator的迭代访问。通过示例代码展示了如何打开、关闭文件,以及如何读写不同数据类型,包括基本类型、opencv数据结构、vector、maps和自定义数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可能大部分人到现在接触的XML和YAML文件很少,等以后训练人脸模型进行人脸识别的时候用的就多了。现在先了解一下这两种文件类型。
XML:Extensible Markup Language,可扩展标记语言,标准通用语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言。可扩展标记语言文件的内容包括几乎所有的万国码Unicode字符
YAML : Yet Another Markup Language,从其字面意识可以知道YAML是另一种标记语言,但是为了强调这种语言以数据作为中心,而不是以置标语言为重点,它是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类于都,容易和脚本语言交互,用来表达资料序列的编程语言。它是XML的数据描述语言,语法比XML简单。

(1)FileStorage
opencv提供了对XML和YAML文件进行读写操作的FileStorage类,其定义有两种形式,如下:

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

根据其两种不同的构造形式,可以有两种FileStorage使用方法
. 第一种:其构造函数不带参数,可以定义一个FileStorage对象,通过FileStorage的成员函数对XML和YAML文件进行读写操作如

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

对于open函数其构造函数如下:

C++: bool FileStorage::open(const string& filename, int flags, const string& encoding=string());

其参数含义与第二种构造函数相同,见下面说明。

. 第二种:其构造函数带参数,对参数进行解释如下
.const string& source: 读入文件的名字或字符串,文件的扩展名.xml或.yml/.yaml决定了文件使XML类型还是YAML类型。如果文件是一个压缩文件,可以在扩展名后缀条件.gz进行访问,如:myHugeMatrix.xml.gz。如果FileStorage::WRITE和FileStorage::MEMORY都指定了,sourec仅能输出指定类型文件(.xml或.yml等)
. int flags: 操作类型标识符,FileStorage类的操作标识符有如下类型:
。FileStorage::READ: 打开文件进行读的操作
。FileStorage::WRITE: 打开文件进行写的操作
。FileStorage::APPEND: 打开文件进行补充操作(Open the file for appending)
。FileStorage::MEMORY:从输入的文件(source)读取数据或把数据写入到内部缓冲器(通过FileStorage::release进行内存释放)
. const string& encoding=string(): 文件结束符。当前还不支持UTF-16类型的XML,必须用8-bit的结束符来代替。

可以通过FileStorage::isOpened函数来判断文件是否正确打开,如果正确打开则函数返回true,否则返回false。对文件进行操作应该养成对文件是否操作成功进行判断的习惯。

(2)FileNode
FileNode是文件存储节点类,对于进行读操作的文件节点用于存储每个文件元素。当读取XML或YMAL文件,节点是第一个被解析并作为一个节点结合存储到存储器中。每个节点都可以作为一个包含一个数字或一个字符或其他节点的“叶子”。每个节点都有一个名字并可以通过节点的名字对节点进行访问,这些节点就组成了一个集合,就算节点没有名字也可以通过元素的索引对节点结合进行排序。文件节点类型可以通过FileNode::type()方法进行指定。
值得注意的是节点只用用来对文件的读取提供引导,而文件进行写操作后将没有数据存储在内存中。FileNode有三种构造形式:

C++: FileNode::FileNode();
C++: FileNode::FileNode(const CvFileStorage* fs, const CvFileNode* node);
C++: FileNode::FileNode(const FileNode& node);

(3)FileNodeIterator
FileNodeIterator用于迭代访问序列(sequences)和映射表(mappings).是一种典型的STL符号,通过node.begin()和node.end()来标识序列的开始和结束位置。其也有三种构造形式,如下:

C++: FileNodeIterator::FileNodeIterator()
C++: FileNodeIterator::FileNodeIterator(const CvFileStorage* fs, const CvFileNode* node, size_t ofs=0)
C++: FileNodeIterator::FileNodeIterator(const FileNodeIterator& it)

示例代码:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值