FileStorage类是opencv中用来进行文件操作的封装类,可以对XML,YAML,txt甚至doc文件进行读写操作。在使用opencv时经常需要对特征数据等进行保存,这时候通常会选择XML文件或者YAML文件。xml和yaml都是属于标记语言,开发者可以根据自身需要定义标签。同时他们也是一种语义/结构化语言,他们可以描述文档的结构和语义。FileStorage类可以对C++的基础数据类型(int,float,double等)、容器类(vector,maps)、opencv定义的数据结构(Mat,Scalar等)进行读写操作。
FileStorage类的使用流程如下:
(1)实例化一个FileStorage类对象
(2)使用流操作符<<进行文件写入,>>进行文件读取,类似C++中的文件操作
(3)使用FileStorage::release()函数析构掉类对象,并关闭文件
给出具体实例:
参考:http://www.cnblogs.com/marcworld/p/3744747.html?utm_source=tuicool&utm_medium=referral
#include <opencv2/core/core.hpp>
#include <iostream>
#include <string>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
//打开XML文件
string filename = "I.xml";
//------------(1)------------
FileStorage fs(filename, FileStorage::WRITE);
//------------(2)------------
//fs.open(filename, FileStorage::READ);
//----------------简单数据结构输入输出----------------
//输出数字和文本
fs << "iterationNr" << 100;
//输入数字和文本
//fs.open(filename, FileStorage::READ); //不要忘记将fs重定向为"READ"
//int itNr;
//------------(1)------------
//fs["iterationNr"] >> itNr;
//------------(2)------------
//itNr = (int)fs["iterationNr"];
//cout<<"iterationNr "<<itNr;
//输出大型数据结构Mat
Mat R = Mat_<uchar >::eye (3, 3),
T = Mat_<double>::zeros(3, 1);
fs << "R" << R;
fs << "T" << T;
//输入Mat
//fs.open(filename, FileStorage::READ); //不要忘记将fs重定向为"READ"
//fs["R"] >> R;
//fs["T"] >> T;
//----------------------------------------------------------
//----------------复杂数据结构输入输出----------------
//输出数组(vector),[]表示vector的边界
fs<<"strings";
fs<<"[";
fs<<"image1.jpg"<<"Awesomeness"<<"baboon.jpg";
fs<<"]";
//输出maps.{}表示maps的边界
fs<<"Mapping";
fs<<"{";
fs<<"One"<<1;
fs<<"Two"<<2;
fs<<"}";
//输入数组
fs.open(filename, FileStorage::READ); //不要忘记将fs重定向为"READ"
FileNode n = fs["strings"]; // 读取字符串序列 - 获取节点
if (n.type() != FileNode::SEQ)
{
cerr << "strings is not a sequence! FAIL" << endl;
return 1;
}
FileNodeIterator it = n.begin(), it_end = n.end(); // 遍历节点
for (; it != it_end; ++it)
cout << (string)*it << endl;
//输入maps
n = fs["Mapping"]; // 从序列中读取map
cout << "Two " << (int)(n["Two"]) << endl;
cout << "One " << (int)(n["One"]) << endl;
//----------------------------------------------------------
//关闭XML文件
fs.release();
return 0;
}
注意:由于XML和YAML是标签语言,通过类似<book>、<name>等来区分不同内容数据。例子中 //输出数组(vector)
fs<<"strings";
fs<<"[";
fs<<"image1.jpg"<<"Awesomeness"<<"baboon.jpg";
fs<<"]";
fs<<"strings";输入的是标签,这里切不可写成fs<<"strings:"如果多加了个冒号则会报错:
OpenCV Error: Bad argument (Key name may only contain alphanumeric characters [a-zA-Z0-9]
fs<<"[";代表向量vector的开始,后续输入则是向量容器中具体数据
fs<<"]";表示之前的vector输入结束.