OpenCV FileStorage 使用记录

转自
https://www.cnblogs.com/fourseas/p/5519681.html

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 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;
}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值