OpenCV FileStorage 使用记录
FileStorage
OpenCV 中的 FileStorage 类能够读写硬盘中的.xml和.yaml文件,这里我们只讨论对 .xml 的以下几种操作:
- 写入(
FileStorage::WRITE,覆盖写) - 追加(
FileStorage::APPEND,追加写) - 读取(
FileStorage::WRITE)
FileStorage 以 FileNode 为单位存储数据,且无法删改某个已有 FileNode的内容,想实现删改功能,得自己造轮子……
写入FileNode
FileNode有两种类型,seq 和 map:
FileStorage fs("data.xml", FileStorage::WRITE);
// seq_node 是一个 seq 型的节点, 以它为父节点,存入10个数据
fs << "seq_node" << "[";
for(size_t i = 0; i < 10; ++i){
fs << i;
}
fs << "]";
// map_node 是一个 map 型节点, 以它为父节点,存入10个数据
fs << "map_node" << "{";
for(size_t i = 0; i < 10; ++i){
fs << "node_" + to_string(i) << i;
}
fs << "}";
fs.release();
通过上面这段代码,我们可以看到 seq 和 map 这两种类型的节点,在写入数据时的差别:前者在子节点间,写入一对方括号[], 而后者写入花括号{};前者在写入子节点的时候,无法为子节点命名,而后者可以。OpenCV 最重要的 Mat 类型在存储时是以 map 方式写入的。
读入FileNode
seq 和 map 节点在读入数据的时候,前者以索引的方式去获得子节点,后者用子节点的名字,即一个字符串去获得子节点(字符串为键,节点为值):
FileStorage fs("data.xml", FileStorage::READ);
vector<int> a, b;
// seq_node 是一个 seq 型的节点
FileNode seq_node = fs["seq_node"];
for(size_t i = 0; i < 10; ++i){
seq_node[i] >> a[i];
}
// map_node 是一个 map 型节点
FileNode map_node = fs["map_node"];
for(size_t i = 0; i < 10; ++i){
fs["node_" + to_string(i)] >> b[i];
}
fs.release();
seq 型节点既然能以索引去取子节点,那自然有人会想到,能不能用迭代器去访问子节点呢?答案是可以。OpenCV为我们提供了FileNode的迭代器:
// seq_node 是一个 seq 型的节点
FileNode seq_node = fs["seq_node"];
FileNodeIterator it = seq_node.begin();
for(; it != seq_node.end(); ++it){
*it >> a[i];
}
自定义类型的读写
需要重载 write 和 read 函数:
struct MyData{
int i;
string str;
Mat I;
}
// 自定义写入
void write(FileStorage &fs, const string &, const MyData &mydata){
fs << "{"
<< "index" << mydata.i
<< "str" << mydata.str
<< "img" << mydata.I
<< "}"
}
// 自定义读取
void read(const FileNode &node, MyData &mydata, const MyData &default_val = MyData()){
if(node.empty()) mydata = default_val;
else {
node["index"] >> mydata.i;
node["str"] >> mydata.str;
node["img"] >> mydata.I;
}
}

本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。
OpenCV FileStorage 使用记录的更多相关文章
- OpenCV学习代码记录——人脸检测
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
- OpenCV学习代码记录—— Snake轮廓
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
- OpenCV学习代码记录——Hough线段检测
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
- OpenCV学习代码记录——轮廓(contour)检测
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
- OpenCV学习代码记录——canny边缘检测
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
- OpenCV FileStorage类读写XML/YML文件
本文转自:http://www.cnblogs.com/summerRQ/articles/2524560.html 在OpenCV程序中,需要保存中间结果的时候常常会使用.xml / .yml文件, ...
- 在工业派上使用opencv库的记录
1.在工业派linux操作系统环境下,调用OpenCV库,用python写了第一个查看图片的程序 注意:要进入工业派的terminal 参考:https://www.cnblogs.com/magic ...
- opencv 实现进度控制
进度控制: #include <opencv\cv.h> #include <opencv\highgui.h> #include <opencv\cxcore.h> ...
- Ubuntu系统---安装Caffe (+OpenCV+Python+CPU-only)
安装配置Ubuntu14.04+Caffe (+OpenCV+Python+CPU-only) 记录 [作者:Wu Ping.时间:20180428.] 本人已经安装很多次的Caffe了:从开始的初探 ...
随机推荐
- MFC 数据库编程 增删改查的一个例子
1.先看下效果图: 主界面: 一个最简单的1对多的表,一张Article(文章)表,一张Category(类别)表.有添加,修改,删除文章按钮.点击类别编辑按钮就会跳到第二个对话框.点击数据库配置就会 ...
- multimap 和 multiset 类型
map 和 set 容器中,一个键只能对应一个实例.而 multiset 和 multimap 类型则允许一个键对应多个实例.例如,在电话簿中,每个人可能有单独的电话号码列表;在作者的文章集中,每位作 ...
- 《Head First Python》学习笔记03 异常处理
异常(运行时错误): 当代码逻辑遇到意外事件时,比如打开一个文件,却发现文件不存在.这时是增加额外的代码处理逻辑,还是捕获异常呢?答案是:Python优先推荐捕获异常,然后恢复. Python异常机制 ...
- Android的状态栏通知(Notification)
通知用于在状态栏显示消息,消息到来时以图标方式表示,如下: 如果需要查看消息,可以拖动状态栏到屏幕下方即可查看消息. 1.Layout布局文件: <RelativeLayout xmlns:an ...
- 浅谈 JavaScript new 执行过程及function原理
前言 最近在学习JavaScript语言精粹,感觉写得相当不错.所以这里也算是总结一下.一个方法使用new的方式创建到底是怎样的过程,一个function的声明内部又是怎样执行的呢 另外学的过程中,不 ...
- C语言之while和do-while
一 while和do-while的简介 1). while语句 语法: while(表达式){ 循环体; } 循环过程: 1.先判断表达式,是否为真,如果为真跳转到2,否则跳转到3 2.执行循环体,执 ...
- crontab 实现定时脚本执行完毕再执行下一次
0 4 * * 1 flock -xn /tmp/oneSendTemp.lock -c /home/check_a/h_demand.sh > /dev/null 2>&1
- 使用vim配置方案spf13中碰到的一些问题
目的:达到我自己自定义安装插件的目的 安装YCM(YouCompleteMe)自动补全神器之前的准备 先安装编译环境: 1 2 sudo apt-get install build-essential ...
- 怎样通过WireShark抓到的包分析出SIP流程图
WireShark抓到了SIP包, 逐条分析, 看瞎...希望能够写个脚本, 自动生成流程图
- session fixation
转自:session fixation攻击 什么是session fixation攻击 Session fixation有人翻译成"Session完成攻击",实际上fixation ...