- <spanstyle="font-family:Arial,sans-serif;font-size:12px;background-color:rgb(255,255);">Opencv存储和读取XML文件使用FileStorage类,对于不同的数据结构,存储和读取的方式不同,下面结合例子具体分析下。</span>
头文件
#include"opencv2/core/core.hpp"
- #include<iostream>
- #include<string>
- #include<vector>
存储XML的代码结构
FileStoragefs(“name.xml”,FileStorage::WRITE);
-
- if(!fs.isOpened())
- {
- cerr<<"failedtoopen"<<filename<<endl;
- }
-
-
- fs.release();
一、一般数据的存储
1. int型数据(float,string,float 等数据类型相同)
intnum;
- fs["Num"]<<num;
2. vector 数据
vector<int>data;
- for(inti=0;i<5;i++)
- data.push_back(i);
- fs<<"VECTOR"<<"[";
- for(vector<int>::iteratorit=data.begin();it!=data.begin();it++)
- {
- fs<<(*it);
- }
- fs<<"]";
3. Map 数据读取
map<string, data.insert(map<string,int>::value_type("one",1));
- data.insert(map<string,87); font-weight:bold; background-color:inherit">int>::value_type("two",2));
- fs<<"MAP"<<"{";
- for
(map<string,87); font-weight:bold; background-color:inherit">int>::iteratorit=data.begin();it!=data.end();it++)
- fs<<it->first<<it->second;
- fs<<"}";
4. Opencv 中矩阵数据的存储
MatR=Mat_::eye(3,3);
- fs<<"Mat"<<R;
二、一般数据的读取
首先需要打开XML文件
FileStoragefs("name.xml",FileStorage::READ);
- }
1. int型数据(float,float 等数据类型相同)
intNum=fs["Num"];
- //or
- fs["Num"]>>Num;
2. vector 数据
FileNoden=fs["VECOTR"];
- if(n.type()!=FileNode::SEQ)
- cerr<<"VECTORisnotasequence!FAIL"<<endl;
- for(FileNodeIteratorit=n.begin();it!=n.end();it++)
- cout<<*it<<endl;
- }
3. Map数据
FileNoden=fs["MAP"];
- cout<<"one"<<(int)n["one"]<<endl;
- cout<<"two"<<(int)n["two"]<<endl;
MatR=fs["MAT"];
三、自定义数据的存储与读取
1、首先需要先定义一个数据结构
class MyData{
public:
MyaData()A(0){B.clear();}
MyData(intk,Mat&m)
A=k;
B=m;
inti=0;i<A;++)
B.push_back(i);
intA;
vector<float>B;
MatR;
//定义存储函数,注意末尾处的const,缺少会出现错误
voidwrite(FileStorage&fs)const
fs<<"{";
fs<<"A"<<A;
fs<<"B"<<"[";
float>::iteratorit=B.begin();it!=B.end();it++)
fs<<"]";
fs<<"R"<<R;
fs<<"}";
//定义读取函数的数据
voidread(FileStorage&node)
//读取A
intA=node["A"];
//读取B
FileNoden=node["B"];
if(n.type()!=cv::FileNode::SEQ)
cerr<<"Bisnotasequence!FAIL"<<endl;
for(cv::FileNodeIteratorit=n.begin();it!=n.end();it++)
cout<<(int)(*it)<<endl;
//读取R
MatR=node["R"];
};
2、定义完数据结构后需要重载两个函数
staticvoidwrite(FileStorage&fs,conststd::string&,153); font-weight:bold; background-color:inherit">constMyData&x){
- x.write(fs);
- voidread(constFileNode&node,MyData&x,153); font-weight:bold; background-color:inherit">constMyData&default_value=MyData()){
- if(node.empty())
- x=default_value;
- else
- x.read(node);
- 3. 对自定义的数据惊醒存储和读取
存储
intnum=2;
- MatR=Mat_::eye(3,3);
- MyDatamydata(2,R);
- fs<<"MYDATA"<<mydata;
读取
MyData*mydata=newMyData();
- fs["MYDATA"]>>(*mydata);
转自 :http://www.52php.cn/article/p-ocxgfswt-hz.html
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|