独家|OpenCV1.8 使用XML和YAML文件实现文件的输入/输出

数据派THU

共 3370字,需浏览 7分钟

 · 2021-08-19

翻译:陈之炎

校对:李海明


本文约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.3 矩阵的掩膜操作(附链接)

独家|OpenCV 1.4 对图像的操作

独家|OpenCV 1.5 利用OpenCV叠加(混合)两幅图像
独家|OpenCV 1.6 改变图像的对比度和亮度!
独家|OpenCV 1.7 离散傅里叶变换




译者简介





陈之炎,北京交通大学通信与控制工程专业毕业,获得工学硕士学位,历任长城计算机软件与系统公司工程师,大唐微电子公司工程师,现任北京吾译超群科技有限公司技术支持。目前从事智能化翻译教学系统的运营和维护,在人工智能深度学习和自然语言处理(NLP)方面积累有一定的经验。业余时间喜爱翻译创作,翻译作品主要有:IEC-ISO 7816、伊拉克石油工程项目、新财税主义宣言等等,其中中译英作品“新财税主义宣言”在GLOBAL TIMES正式发表。能够利用业余时间加入到THU 数据派平台的翻译志愿者小组,希望能和大家一起交流分享,共同进步

翻译组招募信息

工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。


点击文末“阅读原文”加入数据派团队~



转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。



点击“阅读原文”拥抱组织


浏览 11
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报