利用opencv中的类FileStorage生成和读取XML和YAML文件
有时候程序中的变量值、字符串、数组等数据也需要独立于源代码本身保存,这个时候就需要用到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文件相关推荐
- 【OpenCV 4开发详解】保存和读取XML和YMAL文件
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- opencv中Vec类的小白向介绍
大纲 前置知识:C++中类(class)的相关知识 前置知识:C++中模板(template)的相关知识 opencv中Vec类的定义及源码 引申:opencv中的宏定义如CV_8UC3 一.C++中 ...
- 在ROS下利用OpenCV的Mat类,将激光点云展开为深度图像(从零开始,超详细)
激光雷达3D目标检测任务需要将地面滤除,滤除地面的方法多种多样:基于深度学习.基于栅格.基于平面拟合.基于条件随机场.基于深度图像等等.关于将点云转化为深度图像,PCL库中有相关函数,但使用起来有一定 ...
- 利用OpenCV的VideoCapture类实现视频读操作
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 博主注:后来,博主又写了一篇更为详细介绍Vide ...
- OpenCV之core 模块. 核心功能(2)基本绘图 随机数发生器绘制文字 离散傅立叶变换 输入输出XML和YAML文件 与 OpenCV 1 同时使用
基本绘图 目的 本节你将学到: 如何用 Point 在图像中定义 2D 点 如何以及为何使用 Scalar 用OpenCV的函数 line 绘 直线 用OpenCV的函数 ellipse 绘 椭圆 用 ...
- Opencv——写入或读取数据到XML或YAML文件
什么是XML.YAML文件 XML(eXtensible Markup Language)是一种元标记语言.所谓"原标记",就是开发者可以根据自身需要定义的标记,任何满足XML命名 ...
- 【OpenCV】OpenCV实战从入门到精通之 -- 输入输出XML和YAML文件详解
1.XML和YAML文件简介 XML文件是一种元标记语言,即开发者可以根据自身需要定义自己的标记.它是一种语义和结构语言,描述了文档的语义和结构. YAML以数据为中心,是一个可读性高,用来表达资料序 ...
- OpenCV XML和YAML文件的文件输入和输出
OpenCV XML和YAML文件的文件输入和输出 XML和YAML文件的文件输入和输出 目标 源代码 解释 XML / YAML文件打开和关闭. 文本和数字的输入和输出. OpenCV数据结构的输入 ...
- Opencv中Mat类详细解读(学习笔记)
基于windows10.vs2015.OpenCv4.1.0. 目录 1.Mat类简介 2.Mat类的构造与赋值 2.1.Mat类的构造 2.2.Mat类的赋值 3.Mat类支持的运算 3.1Mat类 ...
最新文章
- 微信小程序开发第四弹
- python中调用多进程加速处理文件
- 【深度学习】上海交大发布 MedMNIST 医学图像分析数据集 新基准
- 关于VMware虚拟机的上网
- Python的小特别
- 2.4一元多项式的表示及相加,含cpp算法
- 蓝桥杯:试题 历届真题 修改数组【第十届】【省赛】【研究生组】Java实现
- centos 8+VMware下载安装教程(1)
- 蔚来汽车提交IPO招股书:三年亏百亿,腾讯为大股东
- 焕然一新的 Vue3 中文文档来了!
- Chapter1:控制系统建模
- 吉隆坡兰卡威旅游信息整理
- mysql报表服务器配置_Power Bi报表服务器安装及数据库配置方法
- wing ftp linux 怎么用,Wing FTP Server使用方法(操作步骤)
- 10-2 系统设计真题解析:短网址系统的设计与实现
- 解决: 在路径为[/StudentManagerWeb]的上下文中,servlet[LoginServlet]的Servlet.service()引发异常 java.lang.NullPointe
- 软件需求分析步骤方法
- C++(数据结构与算法):30---散列(哈希)表的介绍(散列函数、散列冲突、散列溢出)
- 四种不同单源最短路径算法性能比较
- c语言程序设计课程总结600字,2019年春季学期《C语言程序设计II》课程总结
热门文章
- 刚安装的python如何使用-python中RabbitMQ的使用(安装和简单教程)
- php和python写爬虫-为什么选择用python做爬虫
- python使用说明书-InfluxDB——python使用手册
- python代码大全p-Python5种代码维护工具
- 为什么要叫python-为什么叫Python
- python一千行入门代码-Python 有哪些一千行左右的经典练手项目?
- python3.7安装numpy模块-CENTOS7 Python3.7安装numpy
- python网络爬虫工程师薪资-月薪2万的爬虫工程师,Python需要学到什么程度?
- python整理excel数据-python操作excel的技巧整理
- python快速编程入门课后简答题答案-Python编程:从入门到实践(课后习题8)