opencv下XML 文件的讀寫

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, string, 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);









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章