有时候程序中的变量值、字符串、数组等数据也需要独立于源代码本身保存,这个时候就需要用到XML和YAML文件进行保存。
OpenCV4提供了用于生成和读取XML文件和YAML文件的类FileStorage,该类的构造函数原型有两种,分别如下:
其构造函数的第一种原型:
C++

cv::FileStorage::FileStorage()

Python:

<FileStorage object> = cv.FileStorage()
<FileStorage object> = cv.FileStorage(filename, flags[, encoding])

其构造函数的第二种原型:
C++

cv::FileStorage::FileStorage(const String & filename,int flags,const String & encoding = String() )

Python:

<FileStorage object> = cv.FileStorage()
<FileStorage object> = cv.FileStorage(filename, flags[, encoding])

第一种原型基本大家都不用,因为没有任何初始化参数,相当于只定义,不做初始化。
通常用的都是第二种原型。
第二种原型中各参数的说明如下。
filename—生成或读取的XML或YAML文件名称,可以使用的后缀名有.xml、.yml/.yaml 、 .json
flags—操作模式选择。其可选值及意义如下:

  • READ—读取文件中的数据
  • WRITE —向打开的文件中写入数据,如果文件不存在,则生成新的文件
  • APPEND —向打开的文件的末尾写入数据,如果文件不存在,则生成新的文件
  • MEMORY —read data from source or write data to the internal buffer(从source读取数据或者写入数据到内部缓冲,这里source该怎么理解?是理解为“源文件”?)
  • FORMAT_MASK—mask for format flags(格式标志的掩码…这个具体是什么意思博主也不清楚…有清楚的请在此博文下留言吧!博主猜想应该是对文件格式控制的需要,但具体是怎么控制的,估计得用过相关的格式控制才会知道)
  • FORMAT_AUTO —自动格式模式?
  • FORMAT_XML —XML 格式
  • FORMAT_YAML —YAML格式
  • FORMAT_JSON —JSON 格式
  • BASE64—write rawdata in Base64 by default.(对原始数据采用Base64编码,Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64编码常用于在HTTP环境下传递较长的标识信息。
  • WRITE_BASE64—enable both WRITE and BASE64(启用上面参数中提到的 WRITE 和 BASE64)

值得注意的是:在Python中,上面的参数可选值都要加上cv.FileStorage_的前缀,比如READ要写为“cv.FileStorage_READ”。

接下来上源码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
# 图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601
# OpenCV的版本为4.1import cv2 as cv
import numpy as npif __name__ == '__main__':# 创建FileStorage对象file,用于写入数据# file = cv.FileStorage('../data/my_data_file.yaml', cv.FileStorage_WRITE)file = cv.FileStorage('../data/my_data_file.xml', cv.FileStorage_WRITE)# 写入数据到XML文件或YAML文件file.write('name', '毛晓彤')file.write('age', 34)file.write('birth_date', '1988-02-16')scores = np.array([[92, 98, 98], [94, 98, 99], [92, 96, 95]])file.write('scores', scores)# 释放对象file.release()# 创建FileStorage对象file1,用于从文件中读取数据file1 = cv.FileStorage('../data/my_data_file.xml', cv.FileStorage_READ)# 判断my_data_file.xml文件是否成功打开if file1.isOpened():# 从XML或YAML文件中读取数据name_read = file1.getNode('name').string()age_read = file1.getNode('age').real()date_read = file1.getNode('birth_date').string()scores_read = file1.getNode('scores').mat()# 显示读取结果print('姓名:{}'.format(name_read))print('年龄:{}'.format(age_read))print('生日:{}'.format(date_read))print('成绩单:{}'.format(scores_read))else:print('Can\'t open my_data_file.xml.')# 释放对象file1.release()

代码说明:
先说成员函数cv.FileStorage.write(),这个函数可用于将变量名称和变量值写入XML或YAML文件。这个成员函数的原型如下:
C++原型有五种,分别如下:

void cv::FileStorage::write(const String &name,int val)
void cv::FileStorage::write(const String &name,doble val)
void cv::FileStorage::write(const String &name,const String &val)
void cv::FileStorage::write(const String &name,const Mat &val)
void cv::FileStorage::write(const String &name,const std::vector<String> &val)

参数name是要写入XML或YAML文件的变量的名称,参数val是对应变量的值。从以上五个原型可以看出,val可以是下面五种类型

int、double、String、Mat、std::vector<String>

而由于Python不是强制类型语言,所以在OpenCV-Python中,FileStorage.write()只有一种原型,如下:

None = cv.FileStorage.write(name, val)

对于Python而言,val在这里的类型有三种,分别为实数(real)、字符串(string)和矩阵(mat)。

值得注意的是,把要写入文件的变量用FileStorage.write()列举完之后,必须要用成员FileStorage的成员函数release()作一次释放操作,否则不会生成相应的文件,比如上面代码中的语句“file.release()”。

再说成员函数cv.FileStorage.getNode(),这个成员函数用于从XML或YAML文件中读取对应变量名的值。其函数原型如下:
C++原型有两种:

cv::FileStorage::operator[](const String & nodename) const
cv::FileStorage::operator[](const char * nodename) const

可见在OpenCV的C++版本中,并没有成员函数FileStorage.getNode(),它用操作符“[]”代替了函数名“getNode”。如果你要问上面原型末尾的const是怎么回事?可以参见我之前写的博文:类中成员函数声明后面的const的含义
其Python原型有三种,如下:

# 读取实数数据时需要用下面这种原型
retval = cv.FileStorage.getNode(nodename).real()
# 读取字符串数据时需要用下面这种原型
retval = cv.FileStorage.getNode(nodename).string()
# 读取矩阵数据时需要用下面这种原型
retval = cv.FileStorage.getNode(nodename).mat()

三种原型的作用已写于上面的注释中,这里就不多做赘述了。
程序运行时生成的yaml和xml文件分别如下,大家可以对照着程序看一看,这样很容易就理解yaml、xml其书写要求分别是怎么样的了。
生成的yaml文件内容如下:

%YAML:1.0
---
name: "毛晓彤"
age: 34
birth_date: "1988-02-16"
scores: !!opencv-matrixrows: 3cols: 3dt: idata: [ 92, 98, 98, 94, 98, 99, 92, 96, 95 ]

生成的xml文件内容如下:

<?xml version="1.0"?>
<opencv_storage>
<name>"毛晓彤"</name>
<age>34</age>
<birth_date>"1988-02-16"</birth_date>
<scores type_id="opencv-matrix"><rows>3</rows><cols>3</cols><dt>i</dt><data>92 98 98 94 98 99 92 96 95</data></scores>
</opencv_storage>

诸君觉得哪种文件的格式看着更舒服呢?欢迎大家留言交流。博主窃以为yaml看着更舒服哦!
好了,这篇博文就写到这里吧!

利用opencv中的类FileStorage生成和读取XML和YAML文件相关推荐

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

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  2. opencv中Vec类的小白向介绍

    大纲 前置知识:C++中类(class)的相关知识 前置知识:C++中模板(template)的相关知识 opencv中Vec类的定义及源码 引申:opencv中的宏定义如CV_8UC3 一.C++中 ...

  3. 在ROS下利用OpenCV的Mat类,将激光点云展开为深度图像(从零开始,超详细)

    激光雷达3D目标检测任务需要将地面滤除,滤除地面的方法多种多样:基于深度学习.基于栅格.基于平面拟合.基于条件随机场.基于深度图像等等.关于将点云转化为深度图像,PCL库中有相关函数,但使用起来有一定 ...

  4. 利用OpenCV的VideoCapture类实现视频读操作

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 博主注:后来,博主又写了一篇更为详细介绍Vide ...

  5. OpenCV之core 模块. 核心功能(2)基本绘图 随机数发生器绘制文字 离散傅立叶变换 输入输出XML和YAML文件 与 OpenCV 1 同时使用

    基本绘图 目的 本节你将学到: 如何用 Point 在图像中定义 2D 点 如何以及为何使用 Scalar 用OpenCV的函数 line 绘 直线 用OpenCV的函数 ellipse 绘 椭圆 用 ...

  6. Opencv——写入或读取数据到XML或YAML文件

    什么是XML.YAML文件 XML(eXtensible Markup Language)是一种元标记语言.所谓"原标记",就是开发者可以根据自身需要定义的标记,任何满足XML命名 ...

  7. 【OpenCV】OpenCV实战从入门到精通之 -- 输入输出XML和YAML文件详解

    1.XML和YAML文件简介 XML文件是一种元标记语言,即开发者可以根据自身需要定义自己的标记.它是一种语义和结构语言,描述了文档的语义和结构. YAML以数据为中心,是一个可读性高,用来表达资料序 ...

  8. OpenCV XML和YAML文件的文件输入和输出

    OpenCV XML和YAML文件的文件输入和输出 XML和YAML文件的文件输入和输出 目标 源代码 解释 XML / YAML文件打开和关闭. 文本和数字的输入和输出. OpenCV数据结构的输入 ...

  9. Opencv中Mat类详细解读(学习笔记)

    基于windows10.vs2015.OpenCv4.1.0. 目录 1.Mat类简介 2.Mat类的构造与赋值 2.1.Mat类的构造 2.2.Mat类的赋值 3.Mat类支持的运算 3.1Mat类 ...

最新文章

  1. 微信小程序开发第四弹
  2. python中调用多进程加速处理文件
  3. 【深度学习】上海交大发布 MedMNIST 医学图像分析数据集 新基准
  4. 关于VMware虚拟机的上网
  5. Python的小特别
  6. 2.4一元多项式的表示及相加,含cpp算法
  7. 蓝桥杯:试题 历届真题 修改数组【第十届】【省赛】【研究生组】Java实现
  8. centos 8+VMware下载安装教程(1)
  9. 蔚来汽车提交IPO招股书:三年亏百亿,腾讯为大股东
  10. 焕然一新的 Vue3 中文文档来了!
  11. Chapter1:控制系统建模
  12. 吉隆坡兰卡威旅游信息整理
  13. mysql报表服务器配置_Power Bi报表服务器安装及数据库配置方法
  14. wing ftp linux 怎么用,Wing FTP Server使用方法(操作步骤)
  15. 10-2 系统设计真题解析:短网址系统的设计与实现
  16. 解决: 在路径为[/StudentManagerWeb]的上下文中,servlet[LoginServlet]的Servlet.service()引发异常 java.lang.NullPointe
  17. 软件需求分析步骤方法
  18. C++(数据结构与算法):30---散列(哈希)表的介绍(散列函数、散列冲突、散列溢出)
  19. 四种不同单源最短路径算法性能比较
  20. c语言程序设计课程总结600字,2019年春季学期《C语言程序设计II》课程总结

热门文章

  1. 刚安装的python如何使用-python中RabbitMQ的使用(安装和简单教程)
  2. php和python写爬虫-为什么选择用python做爬虫
  3. python使用说明书-InfluxDB——python使用手册
  4. python代码大全p-Python5种代码维护工具
  5. 为什么要叫python-为什么叫Python
  6. python一千行入门代码-Python 有哪些一千行左右的经典练手项目?
  7. python3.7安装numpy模块-CENTOS7 Python3.7安装numpy
  8. python网络爬虫工程师薪资-月薪2万的爬虫工程师,Python需要学到什么程度?
  9. python整理excel数据-python操作excel的技巧整理
  10. python快速编程入门课后简答题答案-Python编程:从入门到实践(课后习题8)