OpenCV之XML和YAML文件读写

FileStorage类

该类有两个构造函数

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

准备

对应第一种方法

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

对应第二种方法

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

第一种方式

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

第二种方式

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

读写

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

fs << "iterationNr" << 100;

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

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

数据结构输入输出

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

// 数据结构初始化
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结构的输入和输出,要注意在第一个元素前加上“[”,在最后一个元素后加上“]”。

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

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

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

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

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类对象,同时关闭文件。

fs.release();
posted @ 2019-07-05 09:18  HeoLis  阅读(432)  评论(0编辑  收藏  举报