当前位置:网站首页>【OpenCV】—输入输出XML和YAML文件
【OpenCV】—输入输出XML和YAML文件
2022-06-25 08:06:00 【我菜就爱学】
在这里,第五章的学习已经结束了,明天前进第六章《《掌握imgproc组件》》,扬帆起航,继续加油。。。。。
1、XML和YAML文件简介
(1)XML:可扩展标识语言。XML首先是一种元标记语言。所谓“元标记”,就是开发者可以根据自身需要定义自己的标记,如可以定义标记 、。任何满足XML命名规则的名称都可以标记。这就向不同的应用程序打开了的大门。此外,XML是一种语义/结构化语言,它描述了文档的结构和语义。
一、什么是可扩展标记语言?
- 可扩展标记语言是一种很像超文本标记语言的标记语言。
- 它的设计宗旨是传输数据,而不是显示数据。
- 它的标签没有被预定义。您需要自行定义标签。
- 它被设计为具有自我描述性。
- 它是W3C的推荐标准。
二、可扩展标记语言和超文本标记语言之间的差异
它不是超文本标记语言的替代。
它是对超文本标记语言的补充。
它和超文本标记语言为不同的目的而设计:
- 它被设计用来传输和存储数据,其焦点是数据的内容。
- 超文本标记语言被设计用来显示数据,其焦点是数据的外观。
超文本标记语言旨在显示信息,而它旨在传输信息。
对它最好的描述是:它是独立于软件和硬件的信息传输工具。
(2)YAML:强调这种语言以数据为中心,而不是以置标语言为重点,而用反璞词进行重新命名。YAML是一个可读性高,用来表达资料序列的格式。
脚本语言
由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用。列一下现有的语言实现:Ruby,Java,Perl,Python,PHP,OCaml,JavaScript,Go 。除了Java 和 Go,其他都是脚本语言。
序列化
YAML比较适合做序列化。因为它是宿主语言数据类型直转的。
配置文件
YAML做配置文件也不错。写YAML要比写XML快得多(无需关注标签或引号),并且比ini文档功能更强。
由于兼容性问题,不同语言间的数据流转建议不要用YAML.
2、FileStorage(文件存储)类操作文件的使用引导
说明:XML和YAML是使用非常广泛的文件格式,可以利用XML或者YAML格式的文件存储和还原各式各样的数据结构。还可以存储和载入任意复杂的数据结构,其中就包括了opencv相关周边的数据结构,以及原始数据类型,如整型或者浮点数字和文本字符串。
如下过程来写入或者读取数据到XML或YAML文件中:
- 1、实例化一个FileStorage类的对象,用默认带参数的构造函数完成初始化;或者用FileStorage::open()成员函数辅助初始化
- 2、使用流操作符<<进行文件写入操作,或者<<进行文件读取操作
- 3、使用FileStorage::release()函数析构掉FileStorage类对象,同时关闭文件。
3、实例讲解
【第一步】XML、YAML文件的打开
(1)准备文件写入
说明:FileStorage是OpenCV中XML和YAML文件的存储类,封装了所有相关的信息。它是OpenCV从文件中读取数据或者向文件中写数据时必须要使用的一个类。
此类的构造函数为FileStorage :FileStorage,有两个重载,如下:
FileStorage::FileStorage();
FileStorage::FileStorage(const string& source,int flags,const string& encoding=string());
对于第二种带参数的构造函数,进行写操作范例如下:
FileStorage fs("abc.xml",FileStorage::WRITE);对于第一种不带参数的构造函数,可以使其成员函数FileStorage::open进行数据的写操作
FileStorage fs; fs.open("abc.xml",FileStorage::WRITE);
(2)准备文件读操作
上面讲到的都是以FileStorage::WRITE为标识符的写操作,而读操作采用FileStorage::READ 标识符即可
第一种方式
FileStorage fs("abc.xml",FileStorage::READ);第二种方式
FileStorage fs; fs.open("abc.xml",FileStorage::READ);
注意:上升的操作方式对于YAML同样适用,将XML换成YAML即可
【第二步】进行文件读写操作
(1)文本和数字的输入和输出
定义好FileStorage 类对象之后,写入文件可以使用"<<"运算符,例如:
fs<<"iterationNr"<<100;读取文件,使用">>"运算符,如:
int itNr; fs["itreationNr"]>>itNr; itNr=(int)fs["iterationNr"];
(2)OpenCV数据结构的输入和输出
关于OpenCV数据结构的输入和输出,和基本的C++形式相同,范例如下:
//数据结构初始化 Mat R=Mat_<uchar>::eye(3,3); Mat T=Mat_<double>::zeros(3,1); //向Mat中写入数据 fs<<"R"<<R; fs<<"T"<<T; //从Mat中读取数据 fs["R"]>>R; fs["T"]>>T;
【第三步】vector(arrays)和maps的输入和输出
(1)对于vector结构的输入和输出,要注意在第一个元素前加上”[“,在最后一个元素前加上”]"。
fs <<"string"<<"[";//开始读入string文本序列
fs<<"imagel.jpg"<<"Awesomeness"<<"baboon.jpg";
fs<<"]";//关闭序列
(2)对于map结构的操作,使用的符合是“{ ”和“}”,如:
fs<<"Mapping";//开始读入Mapping文本
fs<<"{"<<"One"<<1;
fs<<"Two"<<2<<"}";
(3)读取这些结构的时候,会用到FileNode和FileNOdeIterator数据结构。对于FileStorage类的“[”,“]"操作符会返回FileNode数据类型;对于一连串的node,可以使用FileNodeIterator.
FileNode n=fs["string"];//读取字符串序列以得到节点
if(n.type()!=FileNode::SEQ)
{
cerr<<"发生错误!字符串不是一个序列!"<<endl;
reruen 1;
}
FileNodeIterator it=n.begin(),it_end=n.end();//遍历节点
for(;it!=it_end;++it)
cout<<(string)*it<<endl;
【第四步】文件关闭
说明:文件关闭操作会在FileStorage类销毁时自动进行,但我们也可显示调用其析构函数FileStorage::release()实现。FileStorage::release()函数会析构掉FileStorage类对象,同时关闭文件。
析构函数(destructor) 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。
fs.release();
4、示例程序:XML和YAML文件的写入
#include<opencv2/opencv.hpp>
#include<time.h>
using namespace cv;
int main()
{
//初始化
FileStorage fs("D:\\test.yaml", FileStorage::WRITE);
//开始文件写入
fs << "frameCount" << 5;
time_t rawtime; time(&rawtime);
fs << "calibrationDate" << asctime(localtime(&rawtime));
Mat cameraMatrix = (Mat_<double>(3, 3) << 1000, 0, 320, 0, 1000, 240, 0, 0, 1);
Mat distCoeffs = (Mat_<double>(5, 1) << 0.1, 0.01, -0.01, 0, 0);
fs << "cameraMatrix" << cameraMatrix << "distCoeffs" << distCoeffs;
fs << "features" << "[";
for (int i = 0; i < 3; i++) {
int x = rand() % 640;
int y = rand() % 480;
uchar lbp = rand() % 256;
fs << "{:" << "x" << x << "y" << y << "lbp" << "[:";
for (int j = 0; j < 8; j++) {
fs << ((lbp >> j) & 1);
}
fs << "]" << "}";
}
fs << "]";
fs.release();
printf("文件读写完毕,请在工程目录下查看生成的文件");
getchar();
return 0;
}


5、示例程序:XML和YAML文件的读取
#include<opencv2/opencv.hpp>
#include <time.h>
#include <string>
using namespace cv;
using namespace std;
int main()
{
//改变字体颜色
system("color 6F");
//初始化
FileStorage fs2("D:\\test.yaml", FileStorage::READ);
// 第一种方法,对FileNode操作
int frameCount = (int)fs2["frameCount"];
string date;
// 第二种方法,使用FileNode运算符> >
fs2["calibrationDate"] >> date;
Mat cameraMatrix2, distCoeffs2;
fs2["cameraMatrix"] >> cameraMatrix2;
fs2["distCoeffs"] >> distCoeffs2;
cout << "frameCount: " << frameCount << endl
<< "calibration date: " << date << endl
<< "camera matrix: " << cameraMatrix2 << endl
<< "distortion coeffs: " << distCoeffs2 << endl;
FileNode features = fs2["features"];
FileNodeIterator it = features.begin(), it_end = features.end();
int idx = 0;
vector<uchar> lbpval;
//使用FileNodeIterator遍历序列
for (; it != it_end; ++it, idx++)
{
cout << "feature #" << idx << ": ";
cout << "x=" << (int)(*it)["x"] << ", y=" << (int)(*it)["y"] << ", lbp: (";
// 我们也可以使用使用filenode > > std::vector操作符很容易的读数值阵列
(*it)["lbp"] >> lbpval;
for (int i = 0; i < (int)lbpval.size(); i++)
cout << " " << (int)lbpval[i];
cout << ")" << endl;
}
fs2.release();
//程序结束,输出一些帮助文字
printf("\n文件读取完毕,请输入任意键结束程序~");
getchar();
return 0;
}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dQMnuqbj-1655886565007)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20220622162644420.png)]](/img/4e/7944e205c71246d0b0e3747eefca37.png)
边栏推荐
- Advanced technology Er, meet internship position information
- tp6自动执行的文件是哪个?tp6核心类库有什么作用呢?
- Openfoam: bottom layer
- What is the role of software validation testing? What is the price of the confirmation test report?
- 如何实现一个系统调用
- Is it safe to open a stock account online now?
- 五、项目实战---识别人和马
- 三、自动终止训练
- Unity addressable batch management
- How to increase the monthly salary of software testing from 10K to 30K? Only automated testing can do it
猜你喜欢

atguigu----17-生命周期

Check whether the point is within the polygon

A 35 year old Tencent employee was laid off and sighed: a suite in Beijing, with a deposit of more than 7 million, was anxious about unemployment

Paper:Generating Hierarchical Explanations on Text Classification via Feature Interaction Detection

Various synchronous learning notes

城链科技平台,正在实现真正意义上的价值互联网重构!

微信小程序_7,项目练习,本地生活

关掉一个线程

In Section 5 of bramble pie project practice, Nokia 5110 LCD is used to display Hello World

EasyPlayer流媒体播放器播放HLS视频,起播速度慢的技术优化
随机推荐
UEFI: repair efi/gpt bootloader
LVS-DR模式单网段案例
三、自动终止训练
第十五周作业
About i/o -- the relationship between memory and CPU and disk
《乔布斯传》英文原著重点词汇笔记(二)【 chapter one】
On which platform is it safe to buy shares and open an account? Ask for sharing
IC研发常用英文术语缩写
【MYSQL】索引的理解和使用
What is the file that tp6 automatically executes? What does the tp6 core class library do?
Word2vec, phrases, phraser, keyedvectors commonly used in gensim
WebGL发布之后不可以输入中文解决方案
QSS buttons of different styles
Advanced technology Er, meet internship position information
openid是什么意思?token是什么意思?
声纹技术(四):声纹识别的工程部署
Hyper-v:hyper-v generation 1 or generation 2 virtual machines
从别人库里拷贝的游戏如何再自己的库里显示
Beam search and five optimization methods
开户券商怎么选择?在线开户是安全么?