对XML和YAML文件实现I/O操作

前端之家收集整理的这篇文章主要介绍了对XML和YAML文件实现I/O操作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

CPOY FROM:http://blog.csdn.net/yang_xian521/article/details/6897684?reload@H_403_2@


1. XML、YAML文件的打开和关闭@H_403_2@

XML\YAML文件在OpenCV中的数据结构为FileStorage,打开操作例如:@H_403_2@

  1. stringfilename=@H_403_2@"I.xml"@H_403_2@;@H_403_2@@H_403_2@
  2. FileStoragefs(filename,FileStorage::WRITE);@H_403_2@
  3. \\...@H_403_2@
  4. fs.open(filename,FileStorage::READ);@H_403_2@

文件关闭操作会在FileStorage结构销毁时自动进行,但也可调用如下函数实现@H_403_2@ @H_403_2@

copy

    fs.release();@H_403_2@@H_403_2@

2.文本和数字的输入和输出

写入文件使用 << 运算符,例如:@H_403_2@

copy

    fs<<@H_403_2@"iterationNr"@H_403_2@<<100;@H_403_2@@H_403_2@

读取文件,使用 >> 运算符,例如@H_403_2@ copy
    int@H_403_2@itNr;@H_403_2@@H_403_2@
  1. fs["iterationNr"@H_403_2@]>>itNr;@H_403_2@@H_403_2@
  2. itNr=(int@H_403_2@)fs[@H_403_2@"iterationNr"@H_403_2@];@H_403_2@@H_403_2@


3. OpenCV数据结构的输入和输出,和基本的C++形式相同@H_403_2@ @H_403_2@

copy
    MatR=Mat_<uchar>::eye(3,3),@H_403_2@@H_403_2@
  1. T=Mat_<double@H_403_2@>::zeros(3,1);@H_403_2@@H_403_2@
  2. fs<<"R"@H_403_2@<<R;@H_403_2@//Writecv::Mat@H_403_2@@H_403_2@@H_403_2@
  3. fs<<"T"@H_403_2@<<T;@H_403_2@@H_403_2@
  4. fs["R"@H_403_2@]>>R;@H_403_2@//Readcv::Mat@H_403_2@@H_403_2@@H_403_2@
  5. fs["T"@H_403_2@]>>T;@H_403_2@@H_403_2@

4. vector(arrays) 和 maps的输入和输出@H_403_2@ vector要注意在第一个元素前加上“[”,在最后一个元素前加上"]"@H_403_2@。例如:@H_403_2@

copy

    fs<<@H_403_2@"strings"@H_403_2@<<@H_403_2@"["@H_403_2@;@H_403_2@//text-stringsequence@H_403_2@@H_403_2@@H_403_2@
  1. fs<<"image1.jpg"@H_403_2@<<@H_403_2@"Awesomeness"@H_403_2@<<@H_403_2@"baboon.jpg"@H_403_2@;@H_403_2@@H_403_2@
  2. fs<<"]"@H_403_2@;@H_403_2@//closesequence@H_403_2@@H_403_2@@H_403_2@

对于map结构的操作使用的符号是"{"和"}"@H_403_2@,例如:@H_403_2@ copy
    fs<<@H_403_2@"Mapping"@H_403_2@;@H_403_2@//text-mapping@H_403_2@@H_403_2@@H_403_2@
  1. fs<<"{"@H_403_2@<<@H_403_2@"One"@H_403_2@<<1;@H_403_2@@H_403_2@
  2. fs<<"Two"@H_403_2@<<2<<@H_403_2@"}"@H_403_2@;@H_403_2@@H_403_2@

读取这些结构的时候,会用到FileNode和FileNodeIterator数据结构。对FileStorage类的[]操作符会返回FileNode数据类型,对于一连串的node,可以使用FileNodeIterator结构@H_403_2@,例如:@H_403_2@ copy
    FileNoden=fs[@H_403_2@"strings"@H_403_2@];@H_403_2@//Readstringsequence-Getnode@H_403_2@@H_403_2@@H_403_2@
  1. if@H_403_2@(n.type()!=FileNode::SEQ)@H_403_2@@H_403_2@
  2. {@H_403_2@
  3. cerr<<"stringsisnotasequence!FAIL"@H_403_2@<<endl;@H_403_2@@H_403_2@
  4. return@H_403_2@1;@H_403_2@@H_403_2@
  5. }@H_403_2@
  6. FileNodeIteratorit=n.begin(),it_end=n.end();//Gothroughthenode@H_403_2@@H_403_2@@H_403_2@
  7. for@H_403_2@(;it!=it_end;++it)@H_403_2@@H_403_2@
  8. cout<<(string)*it<<endl;@H_403_2@

5. 读写自己的数据结构@H_403_2@ 这部分比较复杂,参考最后的实例中的MyData结构自己领悟吧@H_403_2@

最后,我这里上一个实例,供大家参考。@H_403_2@

文件里填入如下代码:@H_403_2@

copy

    #include<opencv2/core/core.hpp>@H_403_2@@H_403_2@@H_403_2@
  1. #include<iostream>@H_403_2@@H_403_2@@H_403_2@
  2. #include<string>@H_403_2@@H_403_2@@H_403_2@
  3. @H_403_2@
  4. using@H_403_2@@H_403_2@namespace@H_403_2@cv;@H_403_2@@H_403_2@
  5. namespace@H_403_2@std;@H_403_2@@H_403_2@
  6. @H_403_2@
  7. void@H_403_2@help(@H_403_2@char@H_403_2@**av)@H_403_2@@H_403_2@
  8. cout<<endl@H_403_2@
  9. <<av[0]<<"showstheusageoftheOpenCVserializationfunctionality."@H_403_2@<<endl@H_403_2@@H_403_2@
  10. <<"usage:"@H_403_2@<<endl@H_403_2@@H_403_2@
  11. <<av[0]<<"outputfile.yml.gz"@H_403_2@<<endl@H_403_2@@H_403_2@
  12. <<"TheoutputfilemaybeeitherXML(xml)orYAML(yml/yaml).Youcanevencompressitby"@H_403_2@@H_403_2@@H_403_2@
  13. <<"specifyingthisinitsextensionlikexml.gzyaml.gzetc..."@H_403_2@<<endl@H_403_2@@H_403_2@
  14. <<"WithFileStorageyoucanserializeobjectsinOpenCVbyusingthe<<and>>operators"@H_403_2@<<endl@H_403_2@@H_403_2@
  15. <<"Forexample:-createaclassandhaveitserialized"@H_403_2@<<endl@H_403_2@@H_403_2@
  16. <<"-useittoreadandwritematrices."@H_403_2@<<endl;@H_403_2@@H_403_2@
  17. }@H_403_2@
  18. class@H_403_2@MyData@H_403_2@@H_403_2@
  19. {@H_403_2@
  20. public@H_403_2@:@H_403_2@@H_403_2@
  21. MyData():A(0),X(0),id()@H_403_2@
  22. {}@H_403_2@
  23. explicit@H_403_2@MyData(@H_403_2@int@H_403_2@):A(97),X(CV_PI),id(@H_403_2@"mydata1234"@H_403_2@)@H_403_2@//explicittoavoidimplicitconversion@H_403_2@@H_403_2@@H_403_2@
  24. void@H_403_2@write(FileStorage&fs)@H_403_2@const@H_403_2@@H_403_2@//Writeserializationforthisclass@H_403_2@@H_403_2@@H_403_2@
  25. fs<<"{"@H_403_2@<<@H_403_2@"A"@H_403_2@<<A<<@H_403_2@"X"@H_403_2@<<X<<@H_403_2@"id"@H_403_2@<<id<<@H_403_2@"}"@H_403_2@;@H_403_2@@H_403_2@
  26. void@H_403_2@read(@H_403_2@const@H_403_2@FileNode&node)@H_403_2@//Readserializationforthisclass@H_403_2@@H_403_2@@H_403_2@
  27. A=(int@H_403_2@)node[@H_403_2@"A"@H_403_2@];@H_403_2@@H_403_2@
  28. X=(double@H_403_2@)node[@H_403_2@"X"@H_403_2@];@H_403_2@@H_403_2@
  29. id=(string)node["id"@H_403_2@];@H_403_2@@H_403_2@
  30. public@H_403_2@:@H_403_2@//DataMembers@H_403_2@@H_403_2@@H_403_2@
  31. int@H_403_2@A;@H_403_2@@H_403_2@
  32. double@H_403_2@X;@H_403_2@@H_403_2@
  33. stringid;@H_403_2@
  34. };@H_403_2@
  35. //ThesewriteandreadfunctionsmustbedefinedfortheserializationinFileStoragetowork@H_403_2@@H_403_2@@H_403_2@
  36. void@H_403_2@write(FileStorage&fs,@H_403_2@const@H_403_2@std::string&,153); background-color:inherit; font-weight:bold">const@H_403_2@MyData&x)@H_403_2@@H_403_2@
  37. x.write(fs);@H_403_2@
  38. const@H_403_2@FileNode&node,MyData&x,153); background-color:inherit; font-weight:bold">const@H_403_2@MyData&default_value=MyData()){@H_403_2@@H_403_2@
  39. if@H_403_2@(node.empty())@H_403_2@@H_403_2@
  40. x=default_value;@H_403_2@
  41. else@H_403_2@@H_403_2@@H_403_2@
  42. x.read(node);@H_403_2@
  43. //Thisfunctionwillprintourcustomclasstotheconsole@H_403_2@@H_403_2@@H_403_2@
  44. ostream&operator<<(ostream&out,const@H_403_2@MyData&m)@H_403_2@@H_403_2@
  45. out<<"{id="@H_403_2@<<m.id<<@H_403_2@","@H_403_2@;@H_403_2@@H_403_2@
  46. out<<"X="@H_403_2@<<m.X<<@H_403_2@","@H_403_2@;@H_403_2@@H_403_2@
  47. out<<"A="@H_403_2@<<m.A<<@H_403_2@"}"@H_403_2@;@H_403_2@@H_403_2@
  48. return@H_403_2@out;@H_403_2@@H_403_2@
  49. int@H_403_2@main(@H_403_2@int@H_403_2@ac,@H_403_2@char@H_403_2@**av)@H_403_2@@H_403_2@
  50. if@H_403_2@(ac!=2)@H_403_2@@H_403_2@
  51. help(av);@H_403_2@
  52. return@H_403_2@1;@H_403_2@@H_403_2@
  53. stringfilename=av[1];@H_403_2@
  54. {//write@H_403_2@@H_403_2@@H_403_2@
  55. MatR=Mat_<uchar>::eye(3,@H_403_2@
  56. MyDatam(1);@H_403_2@
  57. FileStoragefs(filename,FileStorage::WRITE);@H_403_2@
  58. fs<<"iterationNr"@H_403_2@<<100;@H_403_2@@H_403_2@
  59. fs<<"strings"@H_403_2@<<@H_403_2@"["@H_403_2@;@H_403_2@//text-stringsequence@H_403_2@@H_403_2@@H_403_2@
  60. fs<<"image1.jpg"@H_403_2@<<@H_403_2@"Awesomeness"@H_403_2@<<@H_403_2@"baboon.jpg"@H_403_2@;@H_403_2@@H_403_2@
  61. fs<<"]"@H_403_2@;@H_403_2@//closesequence@H_403_2@@H_403_2@@H_403_2@
  62. fs<<"Mapping"@H_403_2@;@H_403_2@//text-mapping@H_403_2@@H_403_2@@H_403_2@
  63. fs<<"{"@H_403_2@<<@H_403_2@"One"@H_403_2@<<1;@H_403_2@@H_403_2@
  64. fs<<"Two"@H_403_2@<<2<<@H_403_2@"}"@H_403_2@;@H_403_2@@H_403_2@
  65. fs<<"R"@H_403_2@<<R;@H_403_2@//cv::Mat@H_403_2@@H_403_2@@H_403_2@
  66. fs<<"T"@H_403_2@<<T;@H_403_2@@H_403_2@
  67. fs<<"MyData"@H_403_2@<<m;@H_403_2@//yourowndatastructures@H_403_2@@H_403_2@@H_403_2@
  68. fs.release();//explicitclose@H_403_2@@H_403_2@@H_403_2@
  69. cout<<"WriteDone."@H_403_2@<<endl;@H_403_2@@H_403_2@
  70. {//read@H_403_2@@H_403_2@@H_403_2@
  71. cout<<endl<<"Reading:"@H_403_2@<<endl;@H_403_2@@H_403_2@
  72. FileStoragefs;@H_403_2@
  73. 403_2@
  74. int@H_403_2@itNr;@H_403_2@@H_403_2@
  75. //fs["iterationNr"]>>itNr;@H_403_2@@H_403_2@@H_403_2@
  76. itNr=(int@H_403_2@)fs[@H_403_2@"iterationNr"@H_403_2@];@H_403_2@@H_403_2@
  77. cout<<itNr;@H_403_2@
  78. if@H_403_2@(!fs.isOpened())@H_403_2@@H_403_2@
  79. cerr<<"Failedtoopen"@H_403_2@<<filename<<endl;@H_403_2@@H_403_2@
  80. FileNoden=fs["strings"@H_403_2@];@H_403_2@ FileNodeIteratorit=n.begin(),0); background-color:inherit">//Gothroughthenode@H_403_2@@H_403_2@@H_403_2@
  81. for@H_403_2@(;it!=it_end;++it)@H_403_2@@H_403_2@
  82. cout<<(string)*it<<endl;@H_403_2@
  83. n=fs["Mapping"@H_403_2@];@H_403_2@//Readmappingsfromasequence@H_403_2@@H_403_2@@H_403_2@
  84. cout<<"Two"@H_403_2@<<(@H_403_2@int@H_403_2@)(n[@H_403_2@"Two"@H_403_2@])<<@H_403_2@";"@H_403_2@;@H_403_2@@H_403_2@
  85. cout<<"One"@H_403_2@<<(@H_403_2@int@H_403_2@)(n[@H_403_2@"One"@H_403_2@])<<endl<<endl;@H_403_2@@H_403_2@
  86. MyDatam;@H_403_2@
  87. MatR,T;@H_403_2@
  88. fs["T"@H_403_2@]>>T;@H_403_2@@H_403_2@
  89. fs["MyData"@H_403_2@]>>m;@H_403_2@//Readyourownstructure_@H_403_2@@H_403_2@@H_403_2@
  90. cout<<endl@H_403_2@
  91. <<"R="@H_403_2@<<R<<endl;@H_403_2@@H_403_2@
  92. cout<<"T="@H_403_2@<<T<<endl<<endl;@H_403_2@@H_403_2@
  93. cout<<"MyData="@H_403_2@<<endl<<m<<endl<<endl;@H_403_2@@H_403_2@
  94. //Showdefaultbehaviorfornonexistingnodes@H_403_2@@H_403_2@@H_403_2@
  95. cout<<"AttempttoreadNonExisting(shouldinitializethedatastructurewithitsdefault)."@H_403_2@;@H_403_2@@H_403_2@
  96. fs["NonExisting"@H_403_2@]>>m;@H_403_2@@H_403_2@
  97. cout<<endl<<"NonExisting="@H_403_2@<<endl<<m<<endl;@H_403_2@@H_403_2@
  98. <<"Tip:Openup"@H_403_2@<<filename<<@H_403_2@"withatexteditortoseetheserializeddata."@H_403_2@<<endl;@H_403_2@@H_403_2@
  99. return@H_403_2@0;@H_403_2@@H_403_2@
  100. }@H_403_2@

编译后,在命令行进入到文件目录,执行test test.xml,运行结果如下,@H_403_2@ 生成一个test . xml文件内容如下:@H_403_2@

[html] copy
    @H_403_2@<?@H_403_2@xml@H_403_2@@H_403_2@version@H_403_2@=@H_403_2@"1.0"@H_403_2@@H_403_2@?>@H_403_2@@H_403_2@@H_403_2@
  1. -<@H_403_2@opencv_storage@H_403_2@>@H_403_2@@H_403_2@@H_403_2@
  2. iterationNr@H_403_2@>@H_403_2@100@H_403_2@</@H_403_2@>@H_403_2@@H_403_2@@H_403_2@
  3. strings@H_403_2@>@H_403_2@image1.jpgAwesomenessbaboon.jpg@H_403_2@ -Mapping@H_403_2@One@H_403_2@>@H_403_2@1@H_403_2@Two@H_403_2@>@H_403_2@2@H_403_2@R@H_403_2@@H_403_2@type_id@H_403_2@=@H_403_2@"opencv-matrix"@H_403_2@rows@H_403_2@>@H_403_2@3@H_403_2@cols@H_403_2@dt@H_403_2@>@H_403_2@u@H_403_2@data@H_403_2@>@H_403_2@100010001@H_403_2@R@H_403_2@T@H_403_2@@H_403_2@type_id@H_403_2@=@H_403_2@"opencv-matrix"@H_403_2@>@H_403_2@d@H_403_2@>@H_403_2@0.0.0.@H_403_2@T@H_403_2@MyData@H_403_2@A@H_403_2@>@H_403_2@97@H_403_2@X@H_403_2@>@H_403_2@3.1415926535897931e+000@H_403_2@id@H_403_2@>@H_403_2@mydata1234@H_403_2@>@H_403_2@@H_403_2@

猜你在找的XML相关文章