opencv下XML 文件的读写 很全滴

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

文件

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

存储XML的代码结构

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

一、一般数据的存储

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

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

2. vector 数据

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

3. Map 数据读取

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

4. Opencv 中矩阵数据的存储

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

二、一般数据的读取


首先需要打开XML文件

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

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

2. vector 数据

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

3. Map数据

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

    MatR=fs["MAT"];


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

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

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

    staticvoidwrite(FileStorage&fs,conststd::string&,153); font-weight:bold; background-color:inherit">constMyData&x){
  1. 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. x=default_value;
  5. else
  6. x.read(node);
  7. 3. 对自定义的数据惊醒存储和读取

    存储

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

    读取

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



    转自 :http://www.jb51.cc/article/p-ocxgfswt-hz.html
    原文链接:https://www.f2er.com/xml/296643.html

    猜你在找的XML相关文章