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