CPOY FROM:http://blog.csdn.net/yang_xian521/article/details/6897684?reload
1. XML、YAML文件的打开和关闭
XMLYAML文件在OpenCV中的数据结构为FileStorage,打开操作例如:
- stringfilename="I.xml";
- FileStoragefs(filename,FileStorage::WRITE);
- ...
- fs.open(filename,FileStorage::READ);
文件关闭操作会在FileStorage结构销毁时自动进行,但也可调用如下函数实现
copy
fs.release();
2.文本和数字的输入和输出
写入文件使用 << 运算符,例如:
copy
fs<<"iterationNr"<<100;
读取文件,使用 >> 运算符,例如
copy
intitNr;
- fs["iterationNr"]>>itNr;
- itNr=(int)fs["iterationNr"];
3. OpenCV数据结构的输入和输出,和基本的C++形式相同
MatR=Mat_<uchar>::eye(3,3),
- T=Mat_<double>::zeros(3,1);
- fs<<"R"<<R;
- fs<<"T"<<T;
- fs["R"]>>R;
- fs["T"]>>T;
4. vector(arrays) 和 maps的输入和输出
vector要注意在第一个元素前加上“[”,在最后一个元素前加上"]"。例如:
copy
fs<<"strings"<<"[";
- fs<<"image1.jpg"<<"Awesomeness"<<"baboon.jpg";
- fs<<"]";
对于map结构的操作使用的符号是"{"和"}",例如:
copy
fs<<"Mapping";
- fs<<"{"<<"One"<<1;
- fs<<"Two"<<2<<"}";
读取这些结构的时候,会用到FileNode和FileNodeIterator数据结构。对FileStorage类的[]操作符会返回FileNode数据类型,对于一连串的node,可以使用FileNodeIterator结构,例如:
copy
FileNoden=fs["strings"];
- if(n.type()!=FileNode::SEQ)
- {
- cerr<<"stringsisnotasequence!FAIL"<<endl;
- return1;
- }
- FileNodeIteratorit=n.begin(),it_end=n.end();
- for
(;it!=it_end;++it)
cout<<(string)*it<<endl;
5. 读写自己的数据结构
这部分比较复杂,参考最后的实例中的MyData结构自己领悟吧
最后,我这里上一个实例,供大家参考。
源文件里填入如下代码:
copy
#include<opencv2/core/core.hpp>
- #include<iostream>
- #include<string>
-
- using
namespacecv;
namespacestd;
voidhelp(char**av)
cout<<endl
<<av[0]<<"showstheusageoftheOpenCVserializationfunctionality."<<endl
<<"usage:"<<endl
<<av[0]<<"outputfile.yml.gz"<<endl
<<"TheoutputfilemaybeeitherXML(xml)orYAML(yml/yaml).Youcanevencompressitby"
<<"specifyingthisinitsextensionlikexml.gzyaml.gzetc..."<<endl
<<"WithFileStorageyoucanserializeobjectsinOpenCVbyusingthe<<and>>operators"<<endl
<<"Forexample:-createaclassandhaveitserialized"<<endl
<<"-useittoreadandwritematrices."<<endl;
}
classMyData
{
public:
MyData():A(0),X(0),id()
{}
explicitMyData(int):A(97),X(CV_PI),id("mydata1234")
voidwrite(FileStorage&fs)const
fs<<"{"<<"A"<<A<<"X"<<X<<"id"<<id<<"}";
voidread(constFileNode&node)
A=(int)node["A"];
X=(double)node["X"];
id=(string)node["id"];
public:
intA;
doubleX;
stringid;
};
voidwrite(FileStorage&fs,conststd::string&,153); background-color:inherit; font-weight:bold">constMyData&x)
x.write(fs);
constFileNode&node,MyData&x,153); background-color:inherit; font-weight:bold">constMyData&default_value=MyData()){
if(node.empty())
x=default_value;
else
x.read(node);
//Thisfunctionwillprintourcustomclasstotheconsole
ostream&operator<<(ostream&out,constMyData&m)
out<<"{id="<<m.id<<",";
out<<"X="<<m.X<<",";
out<<"A="<<m.A<<"}";
returnout;
intmain(intac,char**av)
if(ac!=2)
help(av);
return1;
stringfilename=av[1];
{
MatR=Mat_<uchar>::eye(3,
MyDatam(1);
FileStoragefs(filename,FileStorage::WRITE);
fs<<"iterationNr"<<100;
fs<<"strings"<<"[";
fs<<"image1.jpg"<<"Awesomeness"<<"baboon.jpg";
fs<<"]";
fs<<"Mapping";
fs<<"{"<<"One"<<1;
fs<<"Two"<<2<<"}";
fs<<"R"<<R;
fs<<"T"<<T;
fs<<"MyData"<<m;
fs.release();
cout<<"WriteDone."<<endl;
{
cout<<endl<<"Reading:"<<endl;
FileStoragefs;
intitNr;
itNr=(int)fs["iterationNr"];
cout<<itNr;
if(!fs.isOpened())
cerr<<"Failedtoopen"<<filename<<endl;
FileNoden=fs["strings"];
for(;it!=it_end;++it)
cout<<(string)*it<<endl;
n=fs["Mapping"];
cout<<"Two"<<(int)(n["Two"])<<";";
cout<<"One"<<(int)(n["One"])<<endl<<endl;
MyDatam;
MatR,T;
fs["T"]>>T;
fs["MyData"]>>m;
cout<<endl
<<"R="<<R<<endl;
cout<<"T="<<T<<endl<<endl;
cout<<"MyData="<<endl<<m<<endl<<endl;
//Showdefaultbehaviorfornonexistingnodes
cout<<"AttempttoreadNonExisting(shouldinitializethedatastructurewithitsdefault).";
fs["NonExisting"]>>m;
cout<<endl<<"NonExisting="<<endl<<m<<endl;
<<"Tip:Openup"<<filename<<"withatexteditortoseetheserializeddata."<<endl;
return0;
}
编译后,在命令行进入到文件目录,执行test test.xml,运行结果如下,
生成一个test . xml文件,内容如下:
<?xmlversion="1.0"?>
- -<opencv_storage>
- iterationNr>100</>
- strings>image1.jpgAwesomenessbaboon.jpg -MappingOne>1Two>2Rtype_id="opencv-matrix"rows>3colsdt>udata>100010001RTtype_id="opencv-matrix">d>0.0.0.TMyDataA>97X>3.1415926535897931e+000id>mydata1234>
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|