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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年04月17日 02时19分44秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
单例模式(Singleton)
2019-05-02
ucOS 时钟中断(ISR)
2019-05-02
android Activity之间跳转。
2019-05-02
android Handler解析
2019-05-02
java synchronized详解
2019-05-02
android之Http使用简介
2019-05-02
debian 有用的源
2019-05-02
Linux 安装 .NET Core 1.0 SDK
2019-05-02
我对卓越团队的理解
2019-05-02
linux epoll简介
2019-05-02
python装饰器学习总结
2019-05-02
我在Facebook学到的10个经验
2019-05-02
c语言知识点补遗
2019-05-02
python开发总结五
2019-05-02
EL、JSTL、servlet
2019-05-02
2 QCreator调试并查看源码
2019-05-02
4 Qt 之 pro 配置多个子工程/子模块
2019-05-02
12 Qt 之 QToolBox、QLCDNumber
2019-05-02
32 Qt 之绘图之绘制一个漂亮的西瓜
2019-05-02
33 Qt 之绘图之绘制卡通蚂蚁
2019-05-02