独家|OpenCV1.8 使用XML和YAML文件实现文件的输入/输出
翻译:陈之炎
校对:李海明
本文约2400字,建议阅读5分钟本文为大家介绍了OpenCV使用XML和YAML文件实现的输入输出。
目标
本小节将回答以下问题:
- 如何使用YAML或XML文件打印和读取文本输入到文件和OpenCV?
- 如何对OpenCV数据结构做相同的操作?
- 如何为自定义的数据结构做相同的操作?
- OpenCV中cv::FileStorage , cv::FileNode 和 cv::FileNodeIterator 的数据结构和使用方法。
源代码
C ++
可以在原文下载源代码,也可以在以下目录中
samples/cpp/tutorial_code/core/file_input_output/file_input_output.cpp 找到 OpenCV的源代码库。
这里还有完整的示例代码。
代码详解
在这里,只讲解XML和YAML文件输入。你的输出(及其对应的输入)只能是具有XML和YAML扩展名的文件,并带有XML和YAML数据结构。这里有两种可以串行化的数据结构:映射(诸如STL映射和Python字典)和元素序列(如STL向量)。二者之间的区别是,映射中的每一个元素均有唯一的名称,可以通过该名称进行访问。对于序列而言,则需要通过遍历来查询一个具体的项目。
1. 打开和关闭XML / YAML文件。在读写文件内容之前,首先需要打开文件,在使用结束时关闭文件。OpenCV中的XML / YAML数据结构是CV :: FileStorage。具体来说,该结构可以将文件与硬盘驱动器绑定起来,这样便可以使用它的构造函数或open()函数:
无论是哪一种数据结构,它的第二个参数都是一个常数,可以用来指定操作类型,比如:写入读取或追加。文件的扩展名还决定了输出文件的格式。如果输出文件的扩展名为*.xml.gz*,甚至能够输出压缩文件。
当释放CV :: FileStorage对象之后,该文件将自动关闭。可以通过调用release 函数显式地自动关闭文件:
2. 文本和数字的输入/输出。C ++中,数据结构使用STL库中的<<输出操作符。Python中,则使用了 )。输出任何类型的数据结构,首先需要指定其名称,在C++中,只需要单纯地将名称推给数据流。在Python中,写函数的第一个参数便是名称。可以用以下命令打印文本和数字:
读取是一种简单的寻址方式(使用 []操作符)、casting操作或使用>>操作符读出。在Python中,使用real()和getNode()函数来寻址:
3. OpenCV数据结构的输入/输出。该操作与基础C ++和Python的类型完全相同。
4. 向量(数组)的输入/输出和相关映射。正如前文所述,输出可以是映射和序列(数组,向量)。同样,可以先打印变量的名称,然后指定输出的序列或映射。
在序列的第一个元件之前打印“[”字符,在序列的最后一个元素之后打印 “]”字符。在Python语言中,调用 FileStorage.startWriteStruct(structure_name,struct_type) , 其中struct_type为 cv2.FileNode_MAP或cv2.FileNode_SEQ结构,最后调用FileStorage.endWriteStruct()来实现结构:
同理,对用映射,可以使用“{”和“}”分隔符来代替“[”和]”字符:
在读操作中,可以使用的和cv::FileNodeIterator两种数据结构。cv::FileStorage 类中的[]操作符(在Python中为 getNode()函数)可以返回一个数据类型。如果节点为序列结构,则可以使用CV :: FileNodeIterator进行迭代。在Python中,可以调用at()函数访问序列中的元素,并用size() 函数返回序列长度:
对于映射,可以使用[]操作符(在Python中为at()函数)来访问数据(也可使用>>操作符):
5. 读/写自定义的数据结构。假定有一个数据结构,如下所示:
在C ++中,通过OpenCV 的XML / YAML I / O接口实现串行化?(仅针对OpenCV的数据结构),为自定义的类添加读取和写入函数。在Python中,可以在类的内部一个读取和写入函数来完成类似的操作。内部情况如下:
在C ++中,需要在类的外部添加下列函数的定义:
如果用户试图读取一个不存在的节点时,只返回默认初始值。而更为详细的解决方案则是为对象ID返回一个为-1的值。
一旦添加了该函数定义,则这四个函数便会使用>>操作符写入和<<操作符读取(或是Python中的输入/输出函数)
或者可以尝试读取一个不存在的节点:
程序运行结果
在大多情况下,只需要将定义好的数值打印出来,在显示屏幕上可以看到以下运行输出结果:
更加有趣的是:还可以在输出的XML文件中看到以下结果:
或者在输出的YAML文件中看到以下结果:
可以在YouTube网站观看这个示例的运行视频。
注:本文以C++语言代码为例,获取Java和python版本可在原文中查看:
https://docs.opencv.org/4.5.2/dd/d74/tutorial_file_input_output_with_xml_yml.html
编辑:于腾凯
校对:林亦霖
下一小节:1.9 如何利用OpenCV的parallel_for_并行化代码
往期回顾:
独家|OpenCV 1.1 Mat - 基本图像容器(附链接)
独家|OpenCV 1.2 如何用OpenCV扫描图像、查找表和测量时间(附链接)
独家|OpenCV 1.4 对图像的操作
独家|OpenCV 1.5 利用OpenCV叠加(混合)两幅图像
译者简介
陈之炎,北京交通大学通信与控制工程专业毕业,获得工学硕士学位,历任长城计算机软件与系统公司工程师,大唐微电子公司工程师,现任北京吾译超群科技有限公司技术支持。目前从事智能化翻译教学系统的运营和维护,在人工智能深度学习和自然语言处理(NLP)方面积累有一定的经验。业余时间喜爱翻译创作,翻译作品主要有:IEC-ISO 7816、伊拉克石油工程项目、新财税主义宣言等等,其中中译英作品“新财税主义宣言”在GLOBAL TIMES正式发表。能够利用业余时间加入到THU 数据派平台的翻译志愿者小组,希望能和大家一起交流分享,共同进步
翻译组招募信息
工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。
你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。
其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。
点击文末“阅读原文”加入数据派团队~
转载须知
如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。
发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。
点击“阅读原文”拥抱组织
相关文章
- 提取sbf刷机包文件
- python写入txt文件中文乱码_python中怎么输入文件
- word输入矩阵卡死,导致word在试图打开文件时遇到错误
- Python实战-暴力破解zip文件解压密码
- Excel: 通过VBA代码打开word文件
- 如何实时监控是否有待发送的文件?
- 在Win10下 用 Powershell 或 CMD 完成文件的 MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512 等哈希校验[通俗易懂]
- cocos2dx(3.17)中csb文件使用方法
- mold源码阅读 其一 读取输入文件
- eXtplorer:基于 PHP 和 Javascript 的文件管理程序
- Shell read命令详解:接收键盘或其它文件描述符的输入
- Linux管理缓存文件的新方式(linux缓存文件)
- Linux下的文件管理之旅(linux对文件操作)
- linux文件查找-find
- 如何在Linux系统中处理PDF文件?(linuxpdf文件)
- 文件Linux中删除文件的简单方法(linux 如何删除)
- 日志如何在Oracle中删除已归档的日志文件(oracle中删除归档)
- python基础入门详解(文件输入/输出内建类型字典操作使用方法)
- C#文件操作的简单实例