OpenCV FileStorage 使用记录
2016-05-23 13:41
288 查看
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 国际许可协议进行许可。
相关文章推荐
- Linux系统下init进程的前世今生
- Docker简明教程
- Hadoop2.6.0的FileInputFormat的任务切分原理分析(即如何控制FileInputFormat的map任务数量)
- linux基础(25)--计划任务--RHEL6.5
- 第3课:通过案例对SparkStreaming 透彻理解三板斧之三:解密SparkStreaming运行机制和架构进阶之Job和容错
- nginx的基本配置和虚拟主机的配置
- 2016- Shell细小问题汇总
- Ansible安装配置Nginx
- Linux下安装配置tomcat并部署javaweb项目
- linux基础(五)
- 关于linux Centos 7一个网卡配置多个IP的方法
- Centos7安装完毕后重启提示Initial setup of CentOS Linux 7 (core)的解决方法
- Linux如何切换界面
- tomcat以debug模式启动方法
- red hat 6.5 红帽企业Linux.6.5 yum This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register. 解决办法
- Apache Solr查询语法
- [SCU 4509] Snowdrop修长廊 (斜率DP)
- 学习Linux内核和驱动开发有终南捷径吗?欢迎来辩!(转载,link)
- ansible部署tomcat8
- CentOS6网卡静态IP设置