opencv 使用XML和YAML格式来输入输出文件

源码

链接 link

#include <opencv2/core.hpp>
#include <iostream>
#include <string>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;
}// 自定义数据结构 MyData
// 主要提供序列化和反序列化相关的读写功能
class MyData
{
public:MyData() : A(0), X(0), id() {}explicit MyData(int) : A(97), X(CV_PI), id("mydata1234") {}void write(FileStorage& fs) const{fs << "{" << "A" << A << "X" << X << "id" << id << "}";}void read(const FileNode& node){A = (int)node["A"];X = (double)node["X"];id = (string)node["id"];}public:int A;double X;string id;
};// 序列化和反序列化的辅助函数
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;elsex.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 ac, char** av)
{if (ac != 2){help(av);return 1;}string filename = av[1];{ // 写操作Mat R = Mat_<uchar>::eye(3, 3),T = Mat_<double>::zeros(3, 1);MyData m(1);FileStorage fs(filename, FileStorage::WRITE);fs << "iterationNr" << 100;fs << "strings" << "["; fs << "image1.jpg" << "Awesomeness" << "../data/baboon.jpg";fs << "]"; fs << "Mapping";fs << "{" << "One" << 1;fs << "Two" << 2 << "}";fs << "R" << R; fs << "T" << T;fs << "MyData" << m;fs.release(); cout << "Write Done." << endl;}{ // 读操作cout << endl << "Reading: " << endl;FileStorage fs;fs.open(filename, FileStorage::READ);if (!fs.isOpened()){cerr << "Failed to open " << filename << endl;help(av);return 1;}int itNr;itNr = (int) fs["iterationNr"];cout << itNr << endl;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;n = fs["Mapping"];cout << "Two " << (int)(n["Two"]) << "; ";cout << "One " << (int)(n["One"]) << endl << endl;MyData m;Mat R, T;fs["R"] >> R;fs["T"] >> T;fs["MyData"] >> m;cout << "R = " << R << endl;cout << "T = " << T << endl << endl;cout << "MyData = " << endl << m << endl << endl;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;
}

解析

  1. XML/YAML文件的开关。
    在Opencv中XML和YAML的数据结构是cv::FileStorage
 FileStorage fs(filename, FileStorage::WRITE);// or:// FileStorage fs;// fs.open(filename, FileStorage::WRITE);

该文件会在cv::FileStorage对象被销毁时自动关闭,但是你还是需要使用释放函数来额外声明一下。

fs.release(); // explicit close
  1. 文本和数字的输入输出。
    在c++中,数据结构使用STL库中的<<输出操作符,如下所示。
 fs << "iterationNr" << 100;

读入是一个简单的寻址(通过[]操作符)和强制类型转换操作,或者通过>>操作符进行读操作。

 int itNr;//fs["iterationNr"] >> itNr;itNr = (int) fs["iterationNr"];
  1. Opencv数据结构的输入输出
 Mat R = Mat_<uchar>::eye(3, 3),T = Mat_<double>::zeros(3, 1);fs << "R" << R; // cv::Matfs << "T" << T;fs["R"] >> R; // Read cv::Matfs["T"] >> T;
  1. vector和相关map的输入输出

  2. 读写数据结构
    举一个数据结构的例子

class MyData
{
public:MyData() : A(0), X(0), id() {}
public: // Data Membersint A;double X;string id;
};

在c++中,可以通过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"];}

在C++中,你还需要添加在该类之外的函数定义:

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;elsex.read(node);
}

在这里,您可以观察到,在read部分中,我们定义了如果用户试图读取不存在的节点会发生什么。在这种情况下,我们只返回默认的初始化值,然而,更详细的解决方案是返回例如对象ID的- 1值。

添加了这四个函数后,使用>>操作符进行写操作,使用<<操作符进行读操作。

 MyData m(1);fs << "MyData" << m; // your own data structuresfs["MyData"] >> m; // Read your own structure_

或:

 cout << "Attempt to read NonExisting (should initialize the data structure with its default).";fs["NonExisting"] >> m;cout << endl << "NonExisting = " << endl << m << endl;

结果

Write Done.Reading:
100image1.jpg
Awesomeness
baboon.jpg
Two 2; One 1R = [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"?>
<opencv_storage>
<iterationNr>100</iterationNr>
<strings>image1.jpg Awesomeness baboon.jpg</strings>
<Mapping><One>1</One><Two>2</Two></Mapping>
<R type_id="opencv-matrix"><rows>3</rows><cols>3</cols><dt>u</dt><data>1 0 0 0 1 0 0 0 1</data></R>
<T type_id="opencv-matrix"><rows>3</rows><cols>1</cols><dt>d</dt><data>0. 0. 0.</data></T>
<MyData><A>97</A><X>3.1415926535897931e+000</X><id>mydata1234</id></MyData>
</opencv_storage>
YAML
%YAML:1.0
iterationNr: 100
strings:- "image1.jpg"- Awesomeness- "baboon.jpg"
Mapping:One: 1Two: 2
R: !!opencv-matrixrows: 3cols: 3dt: udata: [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ]
T: !!opencv-matrixrows: 3cols: 1dt: ddata: [ 0., 0., 0. ]
MyData:A: 97X: 3.1415926535897931e+000id: mydata1234

视频链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/873548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 新手学习线路,Java 学习路线是怎样的?

学习Java是一条漫长但有趣的道路。作为一门面向对象编程语言&#xff0c;Java不仅在企业级开发中占据重要地位&#xff0c;还在移动开发、大数据、人工智能等领域有着广泛应用。下面&#xff0c;我将从基础到高级&#xff0c;详细介绍Java学习线路图&#xff0c;帮助新手一步步…

静态代理与动态代理的区别与选择

在当今软件开发领域&#xff0c;代理模式作为一种重要的设计模式&#xff0c;广泛应用于增强现有对象功能、控制访问权限以及实现远程调用等场景。本文旨在深入探讨静态代理与动态代理之间的核心区别&#xff0c;帮助开发者理解两者在实现机制、灵活性、性能表现及适用场景上的…

Filebeat k8s 部署(Deployment)采集 PVC 日志发送至 Kafka——日志处理(二)

文章目录 前言Filebeat Configmap 配置Filebeat Deployment验证总结 前言 在上篇文章中总结了 Django 日志控制台输出、文件写入按天拆分文件&#xff0c;自定义 Filter 增加 trace_id 以及过滤——日志处理&#xff08;一)&#xff0c;将日志以 JSON 格式写入日志文件。我们的…

无人机侦察:二维机扫雷达探测设备技术详解

二维机扫雷达探测设备采用机械扫描方式&#xff0c;通过天线在水平方向和垂直方向上的转动&#xff0c;实现对目标空域的全方位扫描。雷达发射机发射电磁波信号&#xff0c;遇到目标后产生反射&#xff0c;反射信号被雷达接收机接收并处理&#xff0c;进而得到目标的位置、速度…

调用第三方接口-RestTemplate

调用方式 POST请求单个新增批量新增 GET请求1.含PathVariable2.查询列表 POST请求 单个新增 例如后端接口接收参数为 User user 使用RestTemplate发送post请求&#xff0c;暂未进行异常处理 //封装body信息 JsonObject jsonObject new JsonObject(); jsonObject.put("…

Webpack基础学习-Day01

Webpack基础学习-Day01 1.1 webpack 是什么 webpack 是一种前端资源构建工具&#xff0c;一个静态模块打包器(module bundler)。 在 webpack 看来, 前端的所有资源文件(js/json/css/img/less/…)都会作为模块处理。 它将根据模块的依赖关系进行静态分析&#xff0c;打包生成…

spring MVC 简单的案例(2)用户登录

一、用户登录 1&#xff09;前端代码 index.html <!doctype html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, user-scalableno, initial-scale1.0, maxim…

git commit报错: pre-commit hook failed (add --no-verify to bypass)

原因&#xff1a; 在提交前做代码风格检查&#xff0c;若检查不通过&#xff0c;则提交失败 解决方案&#xff1a;进入项目的.git>hooks目录&#xff0c;找到pre-commit文件&#xff0c;删除即可

solr配置(关联数据库,自动从数据库更新数据到solr)

配置mysql的关联 需要使用mysql作为数据源&#xff0c;我们需要增加对mysql使用的jar包 server/solr-webapp/webapp/WEB-INF/lib/ Data-config.xml Name为对应solr中的Entity Query为第一次查询数据库的数据&#xff0c;格式为sql语句。 数据库自动更新到solr上&#xff1a;de…

深入探索Perl中的函数定义与调用机制

Perl是一种功能强大的脚本语言&#xff0c;广泛用于文本处理、系统管理任务、网络编程等领域。Perl的函数是实现代码重用和模块化的关键&#xff0c;它们允许你将一段代码封装起来&#xff0c;以便在程序中多次调用。本文将详细介绍Perl中如何定义和调用函数&#xff0c;以及一…

29. python装饰器

装饰器 装饰器一. 简单的装饰器二. 带参数的装饰器 装饰器 类似于java的切面&#xff0c; 再不更改原函数代码的前提下&#xff0c;动态做一些动作。 一. 简单的装饰器 def logging(func):def wrapper(*args, **kwargs):print("logging is running",filesys.stder…

单周期CPU设计(二)取指模块(minisys)(verilog)(vivado)

timescale 1ns / 1ps // module Ifetc32 (input reset, // 复位信号(高电平有效)input clock, // 时钟(23MHz)output [31:0] Instruction, // 输出指令到其他模块output [31:0] PC_plus_4_out, // (pc4)送执行单元input [31:0] Add_result, // 来自执行单元,算出…

基于STC8H4K64TL单片机的触摸功能和数码管驱动功能实现一个触摸按键单击长按都增加数值另一个触摸按键单击长按都减少数值应用

基于STC8H4K64TL单片机的触摸功能和数码管驱动功能实现一个触摸按键单击长按都增加数值另一个触摸按键单击长按都减少数值应用 STC8H4K64TL单片机介绍STC8H4K64TL单片机管脚图(48个引脚)STC8H4K64TL单片机串口仿真与串口通信STC8H4K64TL单片机管脚图(32个引脚)STC8H4K64TL单…

【学习css3】使用flex和grid实现等高元素布局

过往的实现方法是使用浮动加计算布局来实现&#xff0c;当flex和grid问世时&#xff0c;这一切将变得简单起来 一、简单的两列实现 1、先看页面效果 2、css代码 .container {padding: 10px;width: 100ch;margin: 0 auto;box-shadow: inset 0 0 0 2px #ccc;}.column {margin: 2…

【linux】kernel-trace

文章目录 linux kernel trace配置trace内核配置trace接口使用通用配置Events配置Function配置Function graph配置Stack trace设置 跟踪器tracer功能描述 使用示例1.irqsoff2.preemptoff3.preemptirqsoff linux kernel trace 配置 源码路径&#xff1a; kernel/trace trace内…

[Redis]典型应用——分布式锁

什么是分布式锁&#xff1f; 在一个分布式系统中&#xff0c;也会涉及到多个节点访问同一个公共资源的情况。此时就需要通过锁来做互斥控制&#xff0c;避免出现类似于"线程安全"的问题 举个例子&#xff0c;在平时抢票时&#xff0c;多个用户可能会同时买票&#…

大语言模型-文本向量模型评估基准 MTEB

MTEB&#xff08;Massive Text Embedding Benchmark&#xff09; 涵盖112种语言的58个数据集&#xff0c;包含如下8种任务。 1、双语文本挖掘&#xff08;Bitext Mining&#xff09; 任务目标&#xff1a; 在双语语料库中识别语义等价的句子对。 任务描述&#xff1a; 输入…

Nature子刊 | ATAC-seq、RNA-seq和蛋白组联合分析揭示脂质激活转录因子PPARα在肾脏代偿性肥大的作用机制

2023年6月&#xff0c;美国国立心肺血液研究所的研究团队在Nature Communications上发表题为“Signaling mechanisms in renal compensatory hypertrophy revealed by multi-omics”的文章&#xff0c;该研究通过在单侧肾切除的小鼠模型中使用多组学方法&#xff08;蛋白质组学…

深入浅出WebRTC—NACK

WebRTC 中的 NACK&#xff08;Negative Acknowledgment&#xff09;机制是实时通信中处理网络丢包的关键组件。网络丢包是常见的现象&#xff0c;尤其是在无线网络或不稳定连接中。NACK 机制旨在通过请求重传丢失的数据包来减少这种影响&#xff0c;从而保持通信的连续性和质量…

Open3D 非线性最小二乘法拟合空间球

目录 一、概述 1.1原理 1.2实现步骤 二、代码实现 2.1关键代码 2.1.1定义残差函数 2.1.2拟合球面 2.2完整代码 三、实现效果 3.1原始点云 3.2拟合后点云 3.3结果数据 前期试读&#xff0c;后续会将博客加入下列链接的专栏&#xff0c;欢迎订阅 Open3D点云算法与点…