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();