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

opencv下XML 文件的读写

发布时间:2020-12-16 05:01:27 所属栏目:百科 来源:网络整理
导读:Opencv 存储和读取XML文件使用 FileStorage 类,对于不同的数据结构,存储和读取的方式不同,下面结合例子具体分析下。 头文件 #include "opencv2/core/core.hpp"#include iostream#include string#include vector 存储XML的代码结构 FileStorage fs(“name.
Opencv 存储和读取XML文件使用 FileStorage 类,对于不同的数据结构,存储和读取的方式不同,下面结合例子具体分析下。

头文件

#include "opencv2/core/core.hpp"
#include <iostream>
#include <string>
#include <vector>

存储XML的代码结构

   FileStorage fs(“name.xml”,FileStorage::WRITE); //创建XML文件

    if (!fs.isOpened())
    {
      cerr << "failed to open " << filename << endl;
    }
   /******************************/
   /*  存储数据                 */
   /******************************/
  fs.release();

一、一般数据的存储

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

int num;
fs["Num"]<<num;

2. vector 数据
vector<int> data;
for(int i=0; i<5; i++)
data.push_back(i);

fs<<"VECTOR"<<"["; // 注意要有中括号
for(vector<int>::iterator it =data.begin(); it!= data.begin(); it++)
{
  fs<<(*it);
}
fs<<"]";

3. Map 数据读取
map<string,int> data;
data.insert(map<string,int>::value_type("one",1));
data.insert(map<string,int>::value_type("two",2));

fs<<"MAP"<<"{";//注意要用到大括号
for(map<string,int>::iterator it = data.begin(); it!= data.end(); it++)
{
   fs<<it->first<<it->second;
}
fs<<"}";

4. Opencv 中矩阵数据的存储
Mat R = Mat_::eye(3,3);
fs<<"Mat"<<R;

二、一般数据的读取


首先需要打开XML文件

 FileStorage fs("name.xml",FileStorage::READ);

    if (!fs.isOpened())
    {
      cerr << "failed to open " << filename << endl;
    }

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

2. vector 数据

FileNode n = fs["VECOTR"];
if(n.type()!= FileNode::SEQ)
{
  cerr<<"VECTOR is not a sequence! FAIL"<<endl;
}
for(FileNodeIterator it = n.begin(); it!=n.end(); it++)
{
  cout<< *it<<endl;
}

3. Map数据
FileNode n = fs["MAP"];
cout<<"one"<< (int)n["one"]<<endl;
cout<<"two"<< (int)n["two"]<<endl;

4. Opencv 中矩阵数据的存储
Mat R= fs["MAT"];

三、自定义数据的存储与读取

1、首先需要先定义一个数据结构

class MyData{
 public:
   MyaData()A(0){ B.clear();}
   MyData(int k,Mat& m)
   {
      A =k;
      B = m;
      for(int i=0; i<A;++)
      {
         B.push_back(i);
      }
   }

  int  A;
  vector<float> B;
  Mat R;
  
  // 定义存储函数,注意末尾处的const,缺少会出现错误
  void write(FileStorage &fs) const
  {
    fs<<"{";//必须要有大括号
    fs<<"A"<<A; //存储A
    fs<<"B"<<"["; // 存储B
    for(vector<float>::iterator it = B.begin(); it!=B.end(); it++)
     { 
       fs<<(*it);
     }
    fs<<"]";
    fs<<"R"<<R; //存储R
    fs<<"}";
  } 
 // 定义读取函数的数据
 void read( FileStorage & node)
 {
     // 读取A
     int A = node["A"];
    
     // 读取B
     FileNode n = node["B"];
     
    if(n.type()!=cv::FileNode::SEQ)
    {
        cerr<<"B is not a sequence! FAIL"<<endl;
    }
    
  for(cv::FileNodeIterator it = n.begin(); it!= n.end(); it++)
        cout<<(int)(*it)<<endl;
   
    // 读取R
    Mat R = node["R"];

 }

};

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

static void write(FileStorage& fs,const std::string&,const MyData& x){
  x.write(fs);
}
static void read(const FileNode& node,MyData& x,const MyData& default_value = MyData()){
  if(node.empty())
    x = default_value;
  else
    x.read(node);
}

3. 对自定义的数据惊醒存储和读取

存储

int num = 2;
Mat R = Mat_::eye(3,3);
MyData  mydata(2,R);
fs<<"MYDATA"<<mydata;

读取

MyData *mydata = new MyData();
fs["MYDATA"]>> (*mydata);

(编辑:李大同)

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

    推荐文章
      热点阅读