OpenCV之XML和YAML文件读写

发布 : 2020-01-22 分类 : 计算机视觉 浏览 :

FileStorage 类

该类有两个构造函数

1
2
FileStorage::FileStorage()
FileStorage::FileStorage(const string& source, int flags, const string& endcoding=string())

准备

对应第一种方法

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

对应第二种方法

1
FileStorage fs("abc.xml", FileStorage::WRITE);

第一种方式

1
FileStorage fs("abc.xml", FileStorage::READ);

第二种方式

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

读写

可用”<<”运算符进行写操作

1
fs << "iterationNr" << 100;

用”>>”运算符进行读操作

1
2
3
int itNr;
fs["iterationNr"] >> itNr;
itNr = (int)fs["iterationNr"];

数据结构输入输出

OpenCV 数据结构的输入和输出,和基本的 C++形式相同

1
2
3
4
5
6
7
8
9
10
11
// 数据结构初始化
Mat R = Mat_<uchar>::eye(3, 3);
Mat T = Mat_<double>::zeros(3, 1);

// 向Mat中写入数据
fs << "R" << R;
fs << "T" << T;

// 从Mat中读取数据
fs["R"] >> R;
fs["T"] >> T;

vector(arrays) 和 maps 的输入输出

对于 vector 结构的输入和输出,要注意在第一个元素前加上“[”,在最后一个元素后加上“]”。

1
2
3
fs << "strings" << "[";   //开始读入string文本序列
fs << "image1.jpg" << "Awesomeness" << "baboon.jpg";
fs << "]"; //关闭序列

对于 map 结构的操作,使用的符号是“{” 和 “}”

1
2
3
fs << "Mappimg";  //开始读入mapping文本
fs << "{" << "One" << 1;
fs << "Two" << 2 << "}";

读取这些结构的时候会用到 FileNode 和 FileNodeIterator 数据结构。对 FileStorage 类的“[“ 、 “]”操作符会返回 FileNode 数据结构;对于一连串的 node 可以使用 FileNodeIterator 结构。

1
2
3
4
5
6
7
8
9
FileNode n = fs["strings"];   //读取字符串序列以得到节点
if (n.type() != FileNode::SEQ) {
std::cerr << "发生错误!字符串不是一个序列!" << '\n';
return 1;
}
FileNodeIterator it = n.begin(), it_end = n.end(); //遍历节点
for (; it != it_end; ++it)) {
std::cout << (string)*it << '\n';
}

文件关闭

文件关闭操作会在 FileStorage 类销毁时自动进行,但也可以显示调用其析构函数 FileStorage::release()实现。FileStorage::release()函数会析构掉 FileStorage 类对象,同时关闭文件。

1
fs.release();
本文作者 : HeoLis
原文链接 : https://ishero.net/OpenCV%E4%B9%8BXML%E5%92%8CYAML%E6%96%87%E4%BB%B6%E8%AF%BB%E5%86%99.html
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

学习、记录、分享、获得

微信扫一扫, 向我投食

微信扫一扫, 向我投食