目标

您会找到以下问题的答案:如何使用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文件相关推荐

  1. 独家|OpenCV1.8 使用XML和YAML文件实现文件的输入/输出

    翻译:陈之炎 校对:李海明本文约2400字,建议阅读5分钟本文为大家介绍了OpenCV使用XML和YAML文件实现的输入输出. 目标 本小节将回答以下问题: 如何使用YAML或XML文件打印和读取文本 ...

  2. OpenCV XML和YAML文件的文件输入和输出

    OpenCV XML和YAML文件的文件输入和输出 XML和YAML文件的文件输入和输出 目标 源代码 解释 XML / YAML文件打开和关闭. 文本和数字的输入和输出. OpenCV数据结构的输入 ...

  3. 《Python参考手册(第4版•修订版)》——1.4 文件输入和输出

    本节书摘来自异步社区<Python参考手册(第4版•修订版)>一书中的第1章,第1.4节,作者David M. Beazley,更多章节内容可以访问云栖社区"异步社区" ...

  4. C++ Primer 第五版 第8章类 8.2——文件输入和输出

    目录 8.2 文件输入和输出 fstream头文件 fstream特有的操作 输出文件(写入文件) 输入文件(读取文件) 成员函数open和close 流状态检查和is_open() 文件模式 程序实 ...

  5. C++ 文件输入和输出fout fin

    最近在写C++程序,好久没有用C++,之前学的的一些函数都记不太得了.买了一本<C++ Primer Plus>中文版,看了其中关于文件输入和输出的章节,发现了一些以前没有学过的函数,很有 ...

  6. 《OpenCV3编程入门》学习笔记5 Core组件进阶(六)输入输出XML和YAML文件

    第5章 Core组件进阶 5.6 输入输出XML和YAML文件 5.6.1 XML和YAML文件 XML和YAML是使用非常广泛的文件格式,可以利用XML或者YAML式的文件存储和还原各种数据结构,还 ...

  7. OpenCV之core 模块. 核心功能(2)基本绘图 随机数发生器绘制文字 离散傅立叶变换 输入输出XML和YAML文件 与 OpenCV 1 同时使用

    基本绘图 目的 本节你将学到: 如何用 Point 在图像中定义 2D 点 如何以及为何使用 Scalar 用OpenCV的函数 line 绘 直线 用OpenCV的函数 ellipse 绘 椭圆 用 ...

  8. Opencv——写入或读取数据到XML或YAML文件

    什么是XML.YAML文件 XML(eXtensible Markup Language)是一种元标记语言.所谓"原标记",就是开发者可以根据自身需要定义的标记,任何满足XML命名 ...

  9. 【OpenCV】OpenCV实战从入门到精通之 -- 输入输出XML和YAML文件详解

    1.XML和YAML文件简介 XML文件是一种元标记语言,即开发者可以根据自身需要定义自己的标记.它是一种语义和结构语言,描述了文档的语义和结构. YAML以数据为中心,是一个可读性高,用来表达资料序 ...

最新文章

  1. JavaScript DOM编程艺术 - 读书笔记1-3章
  2. 2021蛋白组学研究常用数据库汇总整理
  3. 第三方提权之serv-u提权
  4. kafka生产者消息分区策略
  5. C++_结构体中const使用场景_结构体_毕业设计案例_使用结构体数组_随机数种子---C++语言工作笔记027
  6. java开发简历编写_编写Java开发人员简历的完整指南
  7. 未在计算机上注册控件-已解决
  8. 如何在Linux中安装/挂载CD-ROM
  9. 电脑开机加速,一下子就提升了20几秒
  10. (附源码)SSM医院人事及科室病区管理JAVA计算机毕业设计项目
  11. mysql数据库拒绝访问的解决过程_记一次MySQL数据库拒绝访问的解决过程
  12. Stduino IDE stm32 最小系统 小蓝板 驱动继电器(五)
  13. jmeter获取上一个接口的返回值作为下一个接口的传入参数
  14. oracle 基本语句
  15. java如何给字符串每三位分隔逗号
  16. 简谈FIR滤波器和IIR滤波器的区别
  17. Ubuntu使用备忘
  18. phpmailer报 You must provide at least one recipient email address.解决办法
  19. 挑灯夜读——MySQL多版本控制
  20. iOS中 视频直播功能-流媒体的使用

热门文章

  1. Matlab神经网络十讲(7): Adaptive Filter and Adaptive Training
  2. [骨科手术导航]2D/3D医学图像配准研究_罗博博_南方科技大学
  3. DHCP数据抓包分析--wireshark
  4. cmake的使用-为什么要使用CMake
  5. switch判断条件
  6. JAVA 编写程序实现如下功能:一个线程进行如下运算1*2+2*3+3*4+……+19*20,而另一个线程则每隔一段时间读取前一个线程的运算结果。
  7. 解决Docker上安装RabbitMQ后Web管理页面打不开的问题
  8. zcmu-1957(状态压缩枚举)
  9. html laber上下居中,CSS未知高度垂直居中的实现
  10. JZOJ 3775. 【NOIP2014模拟8.15】因子的排列