OpenCV之XML和YAML文件读写

作者: HeoLis | 来源:发表于2018-01-28 17:53 被阅读56次

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

    相关文章

      网友评论

        本文标题:OpenCV之XML和YAML文件读写

        本文链接:https://www.haomeiwen.com/subject/yejzaxtx.html