opencv下XML 文件的读写
发布时间:2020-12-15 22:54:58 所属栏目:百科 来源:网络整理
导读:Opencv 存储和读取XML文件使用 FileStorage 类,对于不同的数据结构,存储和读取的方式不同,下面结合例子具体分析下。 头文件 #include "opencv2/core/core.hpp"#include iostream#include string#include vector 存储XML的代码结构 FileStorage fs(“name.
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,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); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |