您的位置:首页 > 运维架构

opencv中的FileStorage类使用注意事项

2016-03-31 20:32 447 查看
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输入结束.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  FileStorage 标签 错误