yamlcpp遍历_OpenCV文件输入和输出使用XML和YAML文件
目标
您会找到以下问题的答案:如何使用YAML或XML文件打印和读取文本和OpenCV文本条目?
OpenCV数据结构如何做同样的操作?
如何为您的数据结构做这个?
源代码
您可以从这里下载,也可以在samples/cpp/tutorial_code/core/file_input_output/file_input_output.cppOpenCV源代码库中找到它。
以下是如何实现目标列表中枚举的所有内容的示例代码。#include
#include
#include
using namespace cv;
using namespace std;
static void help(char** av)
{
cout << endl
<< av[0] << " shows the usage of the OpenCV serialization functionality." << endl
<< "usage: " << endl
<< av[0] << " outputfile.yml.gz" << endl
<< "The output file may be either XML (xml) or YAML (yml/yaml). You can even compress it by "
<< "specifying this in its extension like xml.gz yaml.gz etc... " << endl
<< "With FileStorage you can serialize objects in OpenCV by using the << and >> operators" << endl
<< "For example: - create a class and have it serialized" << endl
<< " - use it to read and write matrices." << endl;
}
class MyData
{
public:
MyData() : A(0), X(0), id()
{}
explicit MyData(int) : A(97), X(CV_PI), id("mydata1234") // explicit to avoid implicit conversion
{}
void write(FileStorage& fs) const //Write serialization for this class
{
fs << "{" << "A" << A << "X" << X << "id" << id << "}";
}
void read(const FileNode& node) //Read serialization for this class
{
A = (int)node["A"];
X = (double)node["X"];
id = (string)node["id"];
}
public: // Data Members
int A;
double X;
string id;
};
//These write and read functions must be defined for the serialization in FileStorage to work
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);
}
// This function will print our custom class to the console
static ostream& operator<
{
out << "{ id = " << m.id << ", ";
out << "X = " << m.X << ", ";
out << "A = " << m.A << "}";
return out;
}
int main(int ac, char** av)
{
if (ac != 2)
{
help(av);
return 1;
}
string filename = av[1];
{ //write
Mat R = Mat_::eye(3, 3),
T = Mat_::zeros(3, 1);
MyData m(1);
FileStorage fs(filename, FileStorage::WRITE);
fs << "iterationNr" << 100;
fs << "strings" << "["; // text - string sequence
fs << "image1.jpg" << "Awesomeness" << "../data/baboon.jpg";
fs << "]"; // close sequence
fs << "Mapping"; // text - mapping
fs << "{" << "One" << 1;
fs << "Two" << 2 << "}";
fs << "R" << R; // cv::Mat
fs << "T" << T;
fs << "MyData" << m; // your own data structures
fs.release(); // explicit close
cout << "Write Done." << endl;
}
{//read
cout << endl << "Reading: " << endl;
FileStorage fs;
fs.open(filename, FileStorage::READ);
int itNr;
//fs["iterationNr"] >> itNr;
itNr = (int) fs["iterationNr"];
cout << itNr;
if (!fs.isOpened())
{
cerr << "Failed to open " << filename << endl;
help(av);
return 1;
}
FileNode n = fs["strings"]; // Read string sequence - Get node
if (n.type() != FileNode::SEQ)
{
cerr << "strings is not a sequence! FAIL" << endl;
return 1;
}
FileNodeIterator it = n.begin(), it_end = n.end(); // Go through the node
for (; it != it_end; ++it)
cout << (string)*it << endl;
n = fs["Mapping"]; // Read mappings from a sequence
cout << "Two " << (int)(n["Two"]) << "; ";
cout << "One " << (int)(n["One"]) << endl << endl;
MyData m;
Mat R, T;
fs["R"] >> R; // Read cv::Mat
fs["T"] >> T;
fs["MyData"] >> m; // Read your own structure_
cout << endl
<< "R = " << R << endl;
cout << "T = " << T << endl << endl;
cout << "MyData = " << endl << m << endl << endl;
//Show default behavior for non existing nodes
cout << "Attempt to read NonExisting (should initialize the data structure with its default).";
fs["NonExisting"] >> m;
cout << endl << "NonExisting = " << endl << m << endl;
}
cout << endl
<< "Tip: Open up " << filename << " with a text editor to see the serialized data." << endl;
return 0;
}
说明
这里我们仅谈论XML和YAML文件输入。您的输出(及其相应的输入)文件可能只有这些扩展中的一个和结构来自此。它们是可以序列化的两种数据结构:映射(如STL映射)和元素序列(如STL向量)。这些之间的区别是,在地图中,每个元素都有一个唯一的名称,通过您可以访问它。对于序列,您需要通过它们查询特定项目。XML / YAML文件打开和关闭。在将任何内容写入此类文件之前,您需要将其打开并结束关闭。OpenCV中的XML / YAML数据结构是cv :: FileStorage。要指定文件在硬盘驱动器上绑定的结构,您可以使用其构造函数或open()函数:string filename = "I.xml";
FileStorage fs(filename, FileStorage::WRITE);
//...
fs.open(filename, FileStorage::READ);
您使用第二个参数中的任何一个是一个常数,指定您可以在其上执行的操作类型:WRITE,READ或APPEND。文件名中指定的扩展名也可以确定要使用的输出格式。如果指定扩展名,例如* .xml.gz *,输出可能会被压缩。
当cv :: FileStorage对象被销毁时,文件会自动关闭。但是,您可以使用发布功能显式地调用此功能:fs.release(); // explicit close文本和数字的输入和输出。数据结构使用与STL库相同的<
读入是一个简单的寻址(通过[]操作符)和转换操作或通过>>操作符读取:int itNr;
fs["iterationNr"] >> itNr;
itNr = (int) fs["iterationNr"];
OpenCV数据结构的输入/输出。那么这些行为就像基本的C ++类型一样:Mat R = Mat_::eye (3, 3),
T = Mat_::zeros(3, 1);
fs << "R" << R; // Write cv::Mat
fs << "T" << T;
fs["R"] >> R; // Read cv::Mat
fs["T"] >> T;
向量(数组)和关联图的输入/输出。如前所述,我们可以输出地图和序列(数组,向量)。再次,我们首先打印变量的名称,然后我们必须指定我们的输出是序列还是地图。对于第一个元素之前的序列打印“[”字符,最后一个“]”字符后:fs << "strings" << "["; // text - string sequence
fs << "image1.jpg" << "Awesomeness" << "baboon.jpg";
fs << "]"; // close sequence
对于地图,钻头是一样的,现在我们使用“{”和“}”分隔符:fs << "Mapping"; // text - mapping
fs << "{" << "One" << 1;
fs << "Two" << 2 << "}";FileNode n = fs["strings"]; // Read string sequence - Get node
if (n.type() != FileNode::SEQ)
{
cerr << "strings is not a sequence! FAIL" << endl;
return 1;
}
FileNodeIterator it = n.begin(), it_end = n.end(); // Go through the node
for (; it != it_end; ++it)
cout << (string)*it << endl;
对于地图,您可以再次使用[]运算符来访问给定项目(或>>运算符):n = fs["Mapping"]; // Read mappings from a sequence
cout << "Two " << (int)(n["Two"]) << "; ";
cout << "One " << (int)(n["One"]) << endl << endl;
读写自己的数据结构。假设你有一个数据结构,如:class MyData
{
public:
MyData() : A(0), X(0), id() {}
public: // Data Members
int A;
double X;
string id;
};
通过OpenCV I / O XML / YAML接口(就像OpenCV数据结构一样),可以通过在类中添加一个读取和写入函数来对其进行序列化。对于内部:void write(FileStorage& fs) const //Write serialization for this class
{
fs << "{" << "A" << A << "X" << X << "id" << id << "}";
}
void read(const FileNode& node) //Read serialization for this class
{
A = (int)node["A"];
X = (double)node["X"];
id = (string)node["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);
}
在这里您可以看到,在阅读部分中,我们定义了如果用户尝试读取不存在的节点会发生什么。在这种情况下,我们只返回默认的初始化值,但是更详细的解决方案是返回一个对象ID的减号值。
一旦添加了这四个函数,就可以使用>>操作符进行写操作,而<
fs << "MyData" << m; // your own data structures
fs["MyData"] >> m; // Read your own structure_
或尝试阅读一个不存在的阅读:fs["NonExisting"] >> m; // Do not add a fs << "NonExisting" << m command for this to work
cout << endl << "NonExisting = " << endl << m << endl;
结果
主要是我们打印出定义的数字。您可以在控制台的屏幕上看到:Write Done.
Reading:
100image1.jpg
Awesomeness
baboon.jpg
Two 2; One 1
R = [1, 0, 0;
0, 1, 0;
0, 0, 1]
T = [0; 0; 0]
MyData =
{ id = mydata1234, X = 3.14159, A = 97}
Attempt to read NonExisting (should initialize the data structure with its default).
NonExisting =
{ id = , X = 0, A = 0}
Tip: Open up output.xml with a text editor to see the serialized data.
不过,输出xml文件中可能会看到的更有趣:<?xml version="1.0"?>
100
image1.jpg Awesomeness baboon.jpg
1
2
3
3
u
1 0 0 0 1 0 0 0 1
3
1
d
0. 0. 0.
97
3.1415926535897931e+000
mydata1234
或YAML文件:%YAML:1.0
iterationNr: 100
strings:
- "image1.jpg"
- Awesomeness
- "baboon.jpg"
Mapping:
One: 1
Two: 2
R: !!opencv-matrix
rows: 3
cols: 3
dt: u
data: [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ]
T: !!opencv-matrix
rows: 3
cols: 1
dt: d
data: [ 0., 0., 0. ]
MyData:
A: 97
X: 3.1415926535897931e+000
id: mydata1234
yamlcpp遍历_OpenCV文件输入和输出使用XML和YAML文件相关推荐
- 独家|OpenCV1.8 使用XML和YAML文件实现文件的输入/输出
翻译:陈之炎 校对:李海明本文约2400字,建议阅读5分钟本文为大家介绍了OpenCV使用XML和YAML文件实现的输入输出. 目标 本小节将回答以下问题: 如何使用YAML或XML文件打印和读取文本 ...
- OpenCV XML和YAML文件的文件输入和输出
OpenCV XML和YAML文件的文件输入和输出 XML和YAML文件的文件输入和输出 目标 源代码 解释 XML / YAML文件打开和关闭. 文本和数字的输入和输出. OpenCV数据结构的输入 ...
- 《Python参考手册(第4版•修订版)》——1.4 文件输入和输出
本节书摘来自异步社区<Python参考手册(第4版•修订版)>一书中的第1章,第1.4节,作者David M. Beazley,更多章节内容可以访问云栖社区"异步社区" ...
- C++ Primer 第五版 第8章类 8.2——文件输入和输出
目录 8.2 文件输入和输出 fstream头文件 fstream特有的操作 输出文件(写入文件) 输入文件(读取文件) 成员函数open和close 流状态检查和is_open() 文件模式 程序实 ...
- C++ 文件输入和输出fout fin
最近在写C++程序,好久没有用C++,之前学的的一些函数都记不太得了.买了一本<C++ Primer Plus>中文版,看了其中关于文件输入和输出的章节,发现了一些以前没有学过的函数,很有 ...
- 《OpenCV3编程入门》学习笔记5 Core组件进阶(六)输入输出XML和YAML文件
第5章 Core组件进阶 5.6 输入输出XML和YAML文件 5.6.1 XML和YAML文件 XML和YAML是使用非常广泛的文件格式,可以利用XML或者YAML式的文件存储和还原各种数据结构,还 ...
- OpenCV之core 模块. 核心功能(2)基本绘图 随机数发生器绘制文字 离散傅立叶变换 输入输出XML和YAML文件 与 OpenCV 1 同时使用
基本绘图 目的 本节你将学到: 如何用 Point 在图像中定义 2D 点 如何以及为何使用 Scalar 用OpenCV的函数 line 绘 直线 用OpenCV的函数 ellipse 绘 椭圆 用 ...
- Opencv——写入或读取数据到XML或YAML文件
什么是XML.YAML文件 XML(eXtensible Markup Language)是一种元标记语言.所谓"原标记",就是开发者可以根据自身需要定义的标记,任何满足XML命名 ...
- 【OpenCV】OpenCV实战从入门到精通之 -- 输入输出XML和YAML文件详解
1.XML和YAML文件简介 XML文件是一种元标记语言,即开发者可以根据自身需要定义自己的标记.它是一种语义和结构语言,描述了文档的语义和结构. YAML以数据为中心,是一个可读性高,用来表达资料序 ...
最新文章
- JavaScript DOM编程艺术 - 读书笔记1-3章
- 2021蛋白组学研究常用数据库汇总整理
- 第三方提权之serv-u提权
- kafka生产者消息分区策略
- C++_结构体中const使用场景_结构体_毕业设计案例_使用结构体数组_随机数种子---C++语言工作笔记027
- java开发简历编写_编写Java开发人员简历的完整指南
- 未在计算机上注册控件-已解决
- 如何在Linux中安装/挂载CD-ROM
- 电脑开机加速,一下子就提升了20几秒
- (附源码)SSM医院人事及科室病区管理JAVA计算机毕业设计项目
- mysql数据库拒绝访问的解决过程_记一次MySQL数据库拒绝访问的解决过程
- Stduino IDE stm32 最小系统 小蓝板 驱动继电器(五)
- jmeter获取上一个接口的返回值作为下一个接口的传入参数
- oracle 基本语句
- java如何给字符串每三位分隔逗号
- 简谈FIR滤波器和IIR滤波器的区别
- Ubuntu使用备忘
- phpmailer报 You must provide at least one recipient email address.解决办法
- 挑灯夜读——MySQL多版本控制
- iOS中 视频直播功能-流媒体的使用
热门文章
- Matlab神经网络十讲(7): Adaptive Filter and Adaptive Training
- [骨科手术导航]2D/3D医学图像配准研究_罗博博_南方科技大学
- DHCP数据抓包分析--wireshark
- cmake的使用-为什么要使用CMake
- switch判断条件
- JAVA 编写程序实现如下功能:一个线程进行如下运算1*2+2*3+3*4+……+19*20,而另一个线程则每隔一段时间读取前一个线程的运算结果。
- 解决Docker上安装RabbitMQ后Web管理页面打不开的问题
- zcmu-1957(状态压缩枚举)
- html laber上下居中,CSS未知高度垂直居中的实现
- JZOJ 3775. 【NOIP2014模拟8.15】因子的排列