利用opencv的FileStorage类实现XML/YAML文件的读写

  FileStorage是opencv2.0以后专门用来读写XML/YAML文件的类,标准的C++实现。利用好XML文件可以极大地方便我们对中间数据的处理。

官方文档:

(1) http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/core/file_input_output_with_xml_yml/file_input_output_with_xml_yml.html#fileinputoutputxmlyaml

(2) http://docs.opencv.org/modules/core/doc/xml_yaml_persistence.html#filestorage

  利用FileStorage主要可以完成对以下几种数据的的输入和输出:数字、文本(字符串)、数组(vector)、maps、自定义数据类型(类)。与C++标准输入输出流的操作方法基本一致:
建立流对象-->打开文件(建立流与文件的连接)-->进行读或写操作-->关闭文件(断开流与文件的连接)。

  使用过程中需要注意以下几点:

  (1)打开文件的时候要指定是"WRITE"还是"READ",一旦指定就只能读或写。写完了要读或者读完了要写前,要先对流对象进行重定向(可以使用FileStorage::open()方法);

  (2)读写可以使用重载的<<和>>操作符,与C++风格保持了一致;

  (3)FileStorage的[]操作符返回一个FileNode数据类型,如果该节点是序列化的(vector),可以使用FileNodeIterator来迭代遍历该节点所有元素;

  (4)每次将FileStorage对象重定向到"WRITE"后,都会从头开始写,即会覆盖之前的全部内容;

  (5)读写自定义的数据类型(自定义类)时,要分别添加内部和外部的读写函数,外部的读写函数相当于对FileStorage对象的插入“<<”和提取“>>”运算符的重载,它们又调用了自定义类的内部读写函数,完成对数据成员的读写。

以下是我的实验代码:


#include <opencv2/core/core.hpp>
#include <iostream>
#include <string>

using namespace std;
using namespace cv;

class MyData //用户自定义类
{
public:
MyData() : A(0), X(0), id() {}
MyData(int i) : X(0), id()
{
A = i;
}
public:
int A;
double X;
string id;
public:
//添加内部读写函数
void write(FileStorage& fs) const
{
fs << "{" ;
fs << "A" << A ;
fs << "X" << X ;
fs << "id" << id;
fs << "}";
}
void read(const FileNode& node)
{
A = (int)(node["A"]);
X = (double)(node["X"]);
id = (string)(node["id"]);
/*node["A"] >> A;
node["X"] >> X;
node["id"] >> id;*/
}
};

//添加外部读写函数
void write(FileStorage& fs, const std::string&, const MyData& x)
{
x.write(fs);
}
void read(const FileNode& node, MyData& x, const MyData& default_value = MyData())
{
if(node.empty())
x = default_value;
else
x.read(node);
}
//重载<<操作符用于向标准输出流输出自定义类
static ostream& operator<<(ostream& out, const MyData& m)
{
out << "{ id = " << m.id << ", ";
out << "X = " << m.X << ", ";
out << "A = " << m.A << "}";
return out;
}

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)
fs<<"strings";
fs<<"[";
fs<<"image1.jpg"<<"Awesomeness"<<"baboon.jpg";
fs<<"]";
//输出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;
//----------------------------------------------------------

//----------------自定义类输入输出----------------
MyData m(1);
//向文件输出
fs << "MyData" << m;
//由文件输入
fs.open(filename, FileStorage::READ); //不要忘记将fs重定向为"READ"
fs["MyData"] >> m;
fs["NonExisting"] >> m; // 请注意不是 fs << "NonExisting" << m
cout << endl << "NonExisting = " << endl << m << endl;
//----------------------------------------------------------

//关闭XML文件
fs.release();

return 0;
}

利用opencv的FileStorage类实现XML/YAML文件的读写

时间: 05-20

利用opencv的FileStorage类实现XML/YAML文件的读写的相关文章

NHibernate生成实体类、xml映射文件

最近工作电脑装完win10后,之前使用的codeSmith安装不了,索性自己写一个. 界面比较简单,如下图: 第一行为Oracle数据库的连接字符串.连接成功后,填充表到第4行的下拉列表中. 第二行为实体类命名空间. 第三行为保存生成类.xml文件选择文件夹. 1 private void btnConnect_Click(object sender, RoutedEventArgs e) 2 { 3 try 4 { 5 using (OracleConnection conn = new Or

OPENCV(3) &mdash;&mdash; 对XML和YAML文件实现I/O 操作

XML\YAML文件在OpenCV中的数据结构为FileStorage string filename = "I.xml"; FileStorage fs(filename, FileStorage::WRITE); \\... fs.open(filename, FileStorage::READ); fs.release();   写入文件使用  <<  运算符 ,读取文件,使用 >> 运算符 fs << "iterationNr&qu

用 Qt 中的 QDomDocument类 处理 XML 文件(上)

我们可以看到,如果所要读取的XML文件不是很大,采用DOM读取方法还是很便捷的,由于我用的也是DOM树读取的方法,所以,本文所介绍的也主要是基于DOM的方法读取. 根据常用的操作,我简单的把对XML的操作分为以下几类: 1 首先对XML文件进行操作,打开文件. 这个其实就是对文件进行操作,可以把它直接定义为构造函数,在对对象进行初始化时完成. TopoDataReader::TopoDataReader(const wstring &filePath):_filePath(filePath),_

利用java.io.File类实现遍历本地磁盘上指定盘符或文件夹的所有的文件

2016-11-18 这是本人的第一篇随笔博客,纠结了半天还是选择自己学的时候比较用心的一些知识点上.利用java.io.File类指定本地的文件夹进行遍历所有的文件. package org.lxm.filedemo; import java.io.File; import java.util.Scanner; /* * 本程序是将某个盘的所有文件夹及其文件全部调出来的操作 */ public class FileAllDemo { public static void main(String

用 Qt 的 QAudioOutput 类播放 WAV 音频文件

用 Qt 的 QAudioOutput 类播放 WAV 音频文件 最近有一个项目,需要同时控制 4 个声卡播放不同的声音,声音文件很简单就是没有任何压缩的 wav 文件. 如果只是播放 wav 文件,那么 Qt 里简单的 QSound 类是最适合的.但是 QSound 有一个很大的缺陷就是无法选择用哪个声卡.一番研究之后,决定用 QAudioOutput 来播放 WAV 音频文件. 网上也能找到几篇相关的文章,比如: http://blog.csdn.net/qyee16/article/det

用 Qt 的 QAudioOutput 类播放 WAV 音频文件(使用了libsndfile外部库)

用 Qt 的 QAudioOutput 类播放 WAV 音频文件 最近有一个项目,需要同时控制 4 个声卡播放不同的声音,声音文件很简单就是没有任何压缩的 wav 文件. 如果只是播放 wav 文件,那么 Qt 里简单的 QSound 类是最适合的.但是 QSound 有一个很大的缺陷就是无法选择用哪个声卡.一番研究之后,决定用 QAudioOutput 来播放 WAV 音频文件. 网上也能找到几篇相关的文章,比如: http://blog.csdn.net/qyee16/article/det

利用JAXB实现java实体类和xml互相转换

1.应用场景 在使用WebService实现数据上传下载,数据查询时,可以利用JAXB实现java实体类和xml互相转换 2.Demo 2.1 student.java 实体类,包含list(set同理).map.Teacher.Date 类型的属性 package jaxb; import java.util.Date; import java.util.List; import java.util.Map; import javax.xml.bind.annotation.XmlAccess

利用opencv中的级联分类器进行人脸检測-opencv学习(1)

OpenCV支持的目标检測的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification).注意,新版本号的C++接口除了Haar特征以外也能够使用LBP特征. 先介绍一下相关的结构,级联分类器的计算特征值的基础类FeatureEvaluator,功能包含读操作read.复制clone.获得特征类型getFeatureType,分配图片分配窗体的操作setImage.setWindow,计算有序特征calcOrd,计算绝对特征calc

利用opencv源代码和vs编程序训练分类器haartraining.cpp

如需转载请注明本博网址:http://blog.csdn.net/ding977921830/article/details/47733363. 一  训练框架 训练人脸检測分类器须要三个步骤: (1) 准备正负样本集,分别放到两个目录里. 我使用的是麻省理工的那个人脸库.大家能够网上搜一下. (2)把正样本集生成正样本描写叙述文件(*.vec),把负样本集生成负样本集合文件.详细怎么操作请參考我博客中的另外两篇文章,各自是http://blog.csdn.net/ding977921830/a

简单实体类和xml文件的相互转换

最近写一个题目,要求将一组员工实体类转换成xml文件,或将xml文件转换成一组实体类.题目不难,但写完感觉可以利用泛型和反射将任意一个实体类和xml文件进行转换.于是今天下午立马动手 试了下,做了个简单的模型,可以将简单的实体类和xml文件进行相互转换,但对实体类的属性类型有限制,目前只支持String, Integer, Double三种类型.但是后面可以扩展. 我的大概思路是这样的,只要能拿到实体类的类型信息,我就能拿到实体类的全部字段名称和类型,拼属性的set和get方法更是简单明了,这时