OpenCV3 之 XML和YAML文件的输入输出
发布日期:2021-07-01 03:59:44 浏览次数:3 分类:技术文章

本文共 2244 字,大约阅读时间需要 7 分钟。

文章目录


1. XML和YAML文件的简介

  • XML(eXtensible Markup Language),一种语义/结构化语言,描述了文档的结构和语义。

  • YAML(YAML Ain’t a Markup Langage),该语言以数据为中心,可读性高,用来表达资料序列的格式。

    .yml 和 .yaml 同为 YAML 格式的后缀名

XML和YAML可以用来存储和还原各种各样的数据结构。

2. 文件操作步骤

与通常的文件操作类似。

step1 文件的打开

实例化一个FileStorage类的对象,用默认带参数的构造函数完成初始化,或者用FileStorage::open()成员函数辅助初始化。

此类的构造函数有如下两个重载:

FileStorage::FileStorage();FileStorage::FileStorage(const string& source, int flags, const string& encoding=string());

通过此类可以在初始化的时候直接指定文件的读/写。

读操作的准备

// 方式1:FileStorage fs("abc.xml", FileStorage::READ);// 方式2:FileStorage fs;fs.open("abc.xml",FileStorage::READ);

写操作的准备

// 方式1:FileStorage fs("abc.xml", FileStorage::WRITE);// 方式2:FileStorage fs;fs.open("abc.xml",FileStorage::WRITE);

step2 文件的读写操作

Mat结构和数字的读写

写入数据

fs << "iterationNr" << 100;Mat R = Mat_
::eye(3,3);fs << "R" << R;

读取数据

int itNr;fs["iterationNr"] >> itNr;itNr = (int) fs["iterationNr"];//----------------------------------------fs["R"] >> R;

vector(arrays)和maps的读写

① 对于vector结构的输入/输出,需要在第一个元素前加"[",在最后一个元素后加"]";对于map结构,使用的是"{""}"

fs << "strings" << "[";fs << "image1.jpg" << "Awesomeness" << "baboon.jpg";fs << "]";//-----------------------------------------fs << "Mapping" ;fs << "{" << "One" << 1;fs << "Two" << 2 << "}";

② 读取这些结构时需要用到FileNode("["、"]"此类的操作符会返回该数据类型)和FileNodeIterator(对于一连串的node)数据结构。

FileNode n = fs["strings"]; //读取字符串序列以得到节点if(n.type() != FileNode::SEQ){
cerr << "错误!字符串不是一个序列" <

step3 文件的关闭

fs.release();

3.例程

#include
#include
using namespace std;using namespace cv;int main() {
FileStorage fs; fs.open("abc.yaml", FileStorage::WRITE); fs << "iterationNr" << 100; Mat R = Mat_
::eye(3, 3); fs << "R" << R; fs << "strings" << "["; fs << "image1.jpg" << "Awesomeness" << "baboon.jpg"; fs << "]"; //----------------------------------------- fs << "Mapping"; fs << "{" << "One" << 1; fs << "Two" << 2 << "}"; Mat T; fs.open("abc.yaml", FileStorage::READ); fs["R"] >> T; cout << T << endl; FileNode n = fs["strings"]; //读取字符串序列以得到节点 if (n.type() != FileNode::SEQ) {
cerr << "错误!字符串不是一个序列" << endl; return 1; } FileNodeIterator it = n.begin(), it_end = n.end(); for (; it != it_end; ++it) cout << (string)*it << endl; fs.release(); system("pause"); return 0;}

参考书籍《OpenCV3编程入门》

转载地址:https://miracle.blog.csdn.net/article/details/100652025 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Python 之 Excel表格的读写操作
下一篇:OpenCV3 之 离散傅里叶变换

发表评论

最新留言

不错!
[***.144.177.141]2024年04月17日 02时19分44秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章