【OpenCV 4开发详解】保存和读取XML和YMAL文件

本文首发于 “小白学视觉”微信公众号,欢迎关注公众号
本文作者为小白,版权归 人民邮电出版社发行所有,禁止转载,侵权必究!

经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。

除了图像数据之外,有时程序中的尺寸较小的Mat类矩阵、字符串、数组等数据也需要进行保存,这些数据通常保存成XML文件或者YAML文件。本小节中将介绍如何利用OpenCV 4中的函数将数据保存成XML文件或者YAML文件以及如何读取这两种文件中的数据。

XML是一种元标记语言,所谓元标记就是使用者可以根据自身需求定义自己的标记,例如可以用、等标记来定义数据的含义,例如用24来表示age数据的数值为24。XML是一种结构化的语言,通过XML语言可以知道数据之间的隶属关系,例如100150表示在color数据中含有两个名为red和blue的数据,两者的数值分别是100和150。通过标记的方式,无论以任何形式保存数据,只要文件满足XML格式,那么读取出来的数据就不会出现混淆和歧义。XML文件的扩展名是“.xml”。

YMAL是一种以数据为中心的语言,通过“变量:数值”的形式来表示每个数据的数值,通过不同的缩进来表示不同数据之间的结构和隶属关系。YMAL可读性高,常用来表达资料序列的格式,它参考了多种语言,包括XML、C语言、Python、Perl等。YMAL文件的扩展名是“.ymal”或者“.yml”。

OpenCV 4中提供了用于生成和读取XML文件和YMAL文件的FileStorage类,类中定义了初始化类、写入数据和读取数据等方法。我们在使用该FileStorage类时首先需要对其进行初始化,初始化可以理解为声明需要操作的文件和操作类型。OpenCV 4提供了两种初始化的方法,分别是不输入任何参数的初始化(可以理解为只定义,并未初始化)和输入文件名称和操作类型的初始化。后者初始化构造函数的函数原型在代码清单2-35中给出。

代码清单2-35 FileStorage()函数原型
1.	cv::FileStorage::FileStorage(const String &  filename,
2.	                                   int  flags,
3.	                                   const String &  encoding = String() 
4.	                                   )
  • filename:打开的文件名称。
  • flags:对文件进行的操作类型标志,常用参数及含义在表2-8给出。
  • encodin:编码格式,目前不支持UTF-16 XML编码,需要使用UTF-8 XML编码。
表2-8 FileStorage()构造函数中对文件操作类型常用标志及含义
标志参数 简记 含义
READ 0 读取文件中的数据
WRITE 1 向文件中重新写入数据,会覆盖之前的数据
APPEND 2 向文件中继续写入数据,新数据在原数据之后
MEMORY 4 将数据写入或者读取到内部缓冲区

该函数是FileStorage类的构造函数,用于声明打开的文件名称和操作的类型。函数第一个参数是打开的文件名称,参数是字符串类型,文件的扩展名是“.xml”、“.ymal”或者“.yml”。打开得文件可以已经存在或者未存在,但是当对文件进行读取操作时需要是已经存在的文件。第二个参数是对文件进行的操作类型标志,例如对文件进行读取操作、写入操作等,常用参数及含义在表2-8给出,由于该标志量在FileStorage类中,因此在使用时需要加上类名作为前缀,例如“FileStorage::WRITE”。最后一个参数是文件的编码格式,目前不支持UTF-16 XML编码,需要使用UTF-8 XML编码,通常情况下使用该参数的默认值即可。

打开文件后,可以通过FileStorage类中的isOpened()函数判断是否成功打开文件,如果成功打开文件,该函数返回true,如果打开文件失败,则该函数返回false。

FileStorage类中默认构造函数没有任何参数,因此没有声明打开的文件和操作的类型,此时需要通过FileStorage类中的open()函数单独进行声明,该函数的函数原型在代码清单2-36中给出。

代码清单2-36 open()函数原型
1.	virtual bool cv::FileStorage::open(const String &  filename,
2.	                                          int  flags,
3.	                                          const String &  encoding = String() 
4.	                                          )
  • filename:打开的文件名称。
  • flags:对文件进行的操作类型标志,常用参数及含义在表2-8给出。
  • encodin:编码格式,目前不支持UTF-16 XML编码,需要使用UTF-8 XML编码。

该函数补充了默认构造函数没有声明打开文件的缺点,函数可以指定FileStorage类打开的文件,如果成功打开文件,则返回值为true,否则为false。函数中所有的参数及含义都与代码清单2-35中的相同,因此这里不再进行赘述。同样,通过该函数打开文件后仍然可以通过FileStorage类中的isOpened()函数判断是否成功打开文件。

打开文件后,类似C++中创建的数据流,可以通过“<<”操作符将数据写入文件中,或者通过“>>”操作符从文件中读取数据。除此之外,还可以通过FileStorage类中的write()函数将数据写入文件中,该函数的函数原型在代码清单2-37中给出。


                
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白学视觉

您的赞赏是我们坚持下去的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值