加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

opencv下XML 文件的读写 很全滴

发布时间:2020-12-16 06:17:40 所属栏目:百科 来源:网络整理
导读:[cpp] view plain copy spanstyle= "font-family:Arial,sans-serif;font-size:12px;background-color:rgb(255,255);" Opencv存储和读取XML文件使用FileStorage类,对于不同的数据结构,存储和读取的方式不同,下面结合例子具体分析下。/span 头文件 #include
[cpp] view plain copy
  1. <spanstyle="font-family:Arial,sans-serif;font-size:12px;background-color:rgb(255,255);">Opencv存储和读取XML文件使用FileStorage类,对于不同的数据结构,存储和读取的方式不同,下面结合例子具体分析下。</span>

头文件

    #include"opencv2/core/core.hpp"
  1. #include<iostream>
  2. #include<string>
  3. #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. //定义存储函数,注意末尾处的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. //定义读取函数的数据
  21. voidread(FileStorage&node)
  22. //读取A
  23. intA=node["A"];
  24. //读取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.52php.cn/article/p-ocxgfswt-hz.html

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读