利用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文件的读写

时间: 2024-10-16 09:51:38

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

利用XStream实现实体类与xml的转换

package com.wanhua.util; import com.thoughtworks.xstream.XStream;import com.thoughtworks.xstream.io.xml.DomDriver; /** * 利用XStream实现实体类与xml的转换 *  * @author w_xfpenga *  *         2014-11-27 */public class XStream2Text { static XStream xStream = new X

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

[Unity3D] 关于txt,xml,json文件的读写,及外部文件(夹)的创建

转载自贴吧:http://tieba.baidu.com/p/2825006787 一.关于txt纯文本的读写 其实.txt,.xml,.json这类文件都属于文本文件,类似的还有.lrc歌词文件,.ini配置文件,.reg注册表文件等等,这类文件所储存的内容都是文本,只是各自有它们自己的格式,便于某些时候专用识别,所以读取txt文本是最基础的文本解析. 静态内部读取txt文本: 这是最简单的方式,建立TextAsset,直接把文本文件拖上去,就可以用了,public TextAsset Txt

OpenCV FileStorage类读写XML/YML文件

本文转自:http://www.cnblogs.com/summerRQ/articles/2524560.html 在OpenCV程序中,需要保存中间结果的时候常常会使用.xml / .yml文件,opencv2.0之前都是使用C风格的代码,当时读写XML文件分别使用函数cvLoad()和cvSave().在2.0以后的OpenCV转为支持C++,这一举措大大减少了代码量以及编程时需要考虑的细节. 新版本的OpenCV的C++接口中,imwrite()和imread()只能保存整数数据,且需要

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

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

1.文件的打开关闭 XML\YAML文件在OpenCV中的数据结构为FileStorage,打开操作例如: string filename = "I.xml"; FileStorage fs(filename, FileStorage::WRITE); \\... fs.open(filename, FileStorage::READ); 文件关闭操作会在FileStorage结构销毁时自动进行,但也可调用如下函数实现 fs.release(); 2.文本和数字的输入和输出 写入文件使

用 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