opencv下XML 文件的读写 很全滴

前端之家收集整理的这篇文章主要介绍了opencv下XML 文件的读写 很全滴前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_502_9@
  • @H_502_11@<spanstyle="font-family:Arial,sans-serif;font-size:12px;background-color:rgb(255,255);">Opencv存储和读取XML文件使用FileStorage类,对于不同的数据结构,存储和读取的方式不同,下面结合例子具体分析下。</span>
  • 文件

      @H_502_11@#include"opencv2/core/core.hpp"
    1. @H_502_11@#include<iostream>
    2. @H_502_11@#include<string>
    3. @H_502_11@#include<vector>

    存储XML的代码结构

      @H_502_11@FileStoragefs(“name.xml”,FileStorage::WRITE);//创建XML文件
    1. @H_502_11@
    2. @H_502_11@if(!fs.isOpened())
    3. @H_502_11@{
    4. @H_502_11@cerr<<"Failedtoopen"<<filename<<endl;
    5. @H_502_11@}
    6. @H_502_11@/******************************/
    7. @H_502_11@/*存储数据*/
    8. @H_502_11@fs.release();

    一、一般数据的存储

    1. int型数据(float,string,float 等数据类型相同)

      @H_502_11@intnum;
    1. @H_502_11@fs["Num"]<<num;

    2. vector 数据

      @H_502_11@vector<int>data;
    1. @H_502_11@for(inti=0;i<5;i++)
    2. @H_502_11@data.push_back(i);
    3. @H_502_11@fs<<"VECTOR"<<"[";//注意要有中括号
    4. for(vector<int>::iteratorit=data.begin();it!=data.begin();it++)
    5. @H_502_11@{
    6. @H_502_11@fs<<(*it);
    7. @H_502_11@}
    8. @H_502_11@fs<<"]";

    3. Map 数据读取

      @H_502_11@map<string, @H_502_11@data.insert(map<string,int>::value_type("one",1));
    1. @H_502_11@data.insert(map<string,87); font-weight:bold; background-color:inherit">int>::value_type("two",2));
    2. @H_502_11@fs<<"MAP"<<"{";//注意要用到大括号
    3. for(map<string,87); font-weight:bold; background-color:inherit">int>::iteratorit=data.begin();it!=data.end();it++)
    4. @H_502_11@fs<<it->first<<it->second;
    5. @H_502_11@fs<<"}";

    4. Opencv 中矩阵数据的存储

      @H_502_11@MatR=Mat_::eye(3,3);
    1. @H_502_11@fs<<"Mat"<<R;

    二、一般数据的读取


    首先需要打开XML文件

      @H_502_11@FileStoragefs("name.xml",FileStorage::READ);
    1. @H_502_11@}

    1. int型数据(float,float 等数据类型相同)
      intNum=fs["Num"];
    1. //or
    2. @H_502_11@fs["Num"]>>Num;

    2. vector 数据

      @H_502_11@FileNoden=fs["VECOTR"];
    1. if(n.type()!=FileNode::SEQ)
    2. @H_502_11@cerr<<"VECTORisnotasequence!FAIL"<<endl;
    3. for(FileNodeIteratorit=n.begin();it!=n.end();it++)
    4. @H_502_11@cout<<*it<<endl;
    5. @H_502_11@}

    3. Map数据

      @H_502_11@FileNoden=fs["MAP"];
    1. @H_502_11@cout<<"one"<<(int)n["one"]<<endl;
    2. @H_502_11@cout<<"two"<<(int)n["two"]<<endl;

      @H_502_11@MatR=fs["MAT"];


    三、自定义数据的存储与读取 1、首先需要先定义一个数据结构

      classMyData{
    1. public:
    2. @H_502_11@MyaData()A(0){B.clear();}
    3. @H_502_11@MyData(intk,Mat&m)
    4. @H_502_11@A=k;
    5. @H_502_11@B=m;
    6. inti=0;i<A;++)
    7. @H_502_11@B.push_back(i);
    8. @H_502_11@
    9. @H_502_11@intA;
    10. @H_502_11@vector<float>B;
    11. @H_502_11@MatR;
    12. //定义存储函数,注意末尾处的const,缺少会出现错误
    13. voidwrite(FileStorage&fs)const
    14. @H_502_11@fs<<"{";//必须要有大括号
    15. @H_502_11@fs<<"A"<<A;//存储A
    16. @H_502_11@fs<<"B"<<"[";//存储B
    17. float>::iteratorit=B.begin();it!=B.end();it++)
    18. @H_502_11@fs<<"]";
    19. @H_502_11@fs<<"R"<<R;//存储R
    20. @H_502_11@fs<<"}";
    21. //定义读取函数的数据
    22. voidread(FileStorage&node)
    23. //读取A
    24. intA=node["A"];
    25. //读取B
    26. @H_502_11@FileNoden=node["B"];
    27. if(n.type()!=cv::FileNode::SEQ)
    28. @H_502_11@cerr<<"Bisnotasequence!FAIL"<<endl;
    29. for(cv::FileNodeIteratorit=n.begin();it!=n.end();it++)
    30. @H_502_11@cout<<(int)(*it)<<endl;
    31. //读取R
    32. @H_502_11@MatR=node["R"];
    33. @H_502_11@};

    2、定义完数据结构后需要重载两个函数

      staticvoidwrite(FileStorage&fs,conststd::string&,153); font-weight:bold; background-color:inherit">constMyData&x){
    1. @H_502_11@x.write(fs);
    2. voidread(constFileNode&node,MyData&x,153); font-weight:bold; background-color:inherit">constMyData&default_value=MyData()){
    3. if(node.empty())
    4. @H_502_11@x=default_value;
    5. else
    6. @H_502_11@x.read(node);
    7. 3. 对自定义的数据惊醒存储和读取

      存储

        intnum=2;
      1. @H_502_11@MatR=Mat_::eye(3,3);
      2. @H_502_11@MyDatamydata(2,R);
      3. @H_502_11@fs<<"MYDATA"<<mydata;

      读取

        @H_502_11@MyData*mydata=newMyData();
      1. @H_502_11@fs["MYDATA"]>>(*mydata);



      转自 :http://www.jb51.cc/article/p-ocxgfswt-hz.html

      猜你在找的XML相关文章