【VS开发】【计算机视觉】OpenCV读写xml文件《C++版本》
OpenCV FileStorage类读写XML/YML文件
在OpenCV程序中,需要保存中间结果的时候常常会使用.xml / .yml文件,opencv2.0之前都是使用C风格的代码,当时读写XML文件分别使用函数cvLoad()和cvSave()。在2.0以后的OpenCV转为支持C++,这一举措大大减少了代码量以及编程时需要考虑的细节。
新版本的OpenCV的C++接口中,imwrite()和imread()只能保存整数数据,且需要以图像格式。当需要保存浮点数据或者XML/YML文件时,之前的C语言接口cvSave()函数已经在C++接口中被删除,代替它的是FileStorage类。这个类非常的方便,封装了很多数据结构的细节,编程的时候可以根据统一的接口对数据结构进行保存。
1. FileStorage类写XML/YML文件
• 新建一个FileStorage对象,以FileStorage::WRITE的方式打开一个文件。
• 使用 << 操作对该文件进行操作。
• 释放该对象,对文件进行关闭。
例子如下:
FileStorage fs("test.yml", 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初始化方式 Mat distCoeffs = (Mat_<double>(5,1) << 0.1, 0.01, -0.001, 0, 0); fs << "cameraMatrix" << cameraMatrix << "distCoeffs" << distCoeffs; //features为一个大小为3的向量,其中每个元素由随机数x,y和大小为8的uchar数组组成 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();
2. FileStorage类读XML/YML文件
FileStorage对存储内容在内存中是以层次的节点组成的,每个节点类型为FileNode,FileNode可以使单个的数值、数组或者一系列FileNode的集合。FileNode又可以看做是一个容器,使用iterator接口可以对该节点内更小单位的内容进行访问,例如访问到上面存储的文件中"features"的内容。步骤与写文件类似:
• 新建FileStorage对象,以FileStorage::READ 方式打开一个已经存在的文件
• 使用FileStorage::operator []()函数对文件进行读取,或者使用FileNode和FileNodeIterator
• 使用FileStorage::release()对文件进行关闭
例子如下:
FileStorage fs("test.yml", FileStorage::READ); //方式一: []操作符 int frameCount = (int)fs["frameCount"]; //方式二: FileNode::operator >>() string date; fs["calibrationDate"] >> date; Mat cameraMatrix2, distCoeffs2; fs["cameraMatrix"] >> cameraMatrix2; fs["distCoeffs"] >> distCoeffs2; //注意FileNodeIterator的使用,似乎只能用一维数组去读取里面所有的数据 FileNode features = fs["features"]; FileNodeIterator it = features.begin(), it_end = features.end(); int idx = 0; std::vector<uchar> lbpval; for( ; it != it_end; ++it, idx++ ) { cout << "feature #" << idx << ": "; cout << "x=" << (int)(*it)["x"] << ", y=" << (int)(*it)["y"] << ", lbp: ("; (*it)["lbp"] >> lbpval; //直接读出一维向量 for( int i = 0; i < (int)lbpval.size(); i++ ) cout << " " << (int)lbpval[i]; cout << ")" << endl; } fs.release();
另外,注意在新建FileStorage对象之后,并以READ或WRITE模式打开文件之后,可以用FileStorage::isOpened()查看文件状态,判断是否成功打开了文件。
相关文章
- C#中的深度学习(一):使用OpenCV识别硬币
- python如何获取一个视频的帧率_python-使用OpenCV计算视频文件中的帧数?
- 基于OpenCV的彩色图像色彩增强代码(C++代码)
- 用C++_OpenCV生成一幅灰度值为0~255的测试图像(测试矩阵)
- Python-OpenCV难道比C++_OpenCV快?以调用Canny边缘检测函数为例
- 详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::BackgroundSubtractorMOG2,并利用它实现对道路监控视频前景/背景的提取
- 详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorMOG,并利用它实现对道路监控视频前景/背景的提取
- 详解C++标准库<sstream>中的类stringstream,并利用它实现OpenCV下的图片批量读取
- 图像金字塔、高斯金字塔、拉普拉斯金字塔是怎么回事?附利用拉普拉斯金字塔和高斯金字塔重构原图的Python-OpenCV代码
- 利用OpenCV的函数equalizeHist()对图像作直方图均衡化处理
- OpenCV环境下实现图像任意角度旋转的原理及代码
- Python库Numpy中的数据类型与OpenCV中数据类型的对应关系以及改写相关代码时需注意的地方
- 用OpenCV实现图像的水平镜像变换(翻转)、竖直镜像变换(翻转)(又叫垂直镜像变换)的C/C++源码
- 使用OpenCV的函数createTrackbar()创建窗口滑动条查找图像二值化的最优阈值的C++源码
- 图像线性变换的原理及基于OpenCV的C++实现
- 基于OpenCV的灰度图像归一化到0~255(即对比度拉伸)的C++代码,并附原理介绍
- 利用OpenCV的函数Rect()提取感兴趣区域的C++代码
- 利用OpenCV窗口鼠标事件设置函数setMouseCallback()实现显示当前鼠标坐标、截取指定区域图像等功能;并附函数putText()、circle()、rectangle()的介绍
- 什么叫高斯噪声,并附用OpenCV函数fill()为图像添加高斯噪声的C++代码
- 《Arduino计算机视觉编程》一第3章 用OpenCV和Arduino进行数据采集3.1 图像和视频采集
- c#调用c++(Opencv)dll的实例
- C#调用C++(opencv)中图片数据传递的问题
- C++ OpenCV 图像转换,识别图像轮廓,画矩形
- OpenCV+yolov3实现目标检测(C++,Python)
- VS集成opencv编译C++项目遇到的问题
- 【图像处理】openCV光流法追踪运动物体
- OpenCV For iOS 1: 连接OpenCV 3.0
- 【图像处理】——Python+opencv实现提取图像的几何特征(面积、周长、细长度、区间占空比、重心、不变矩等)
- C++使用opencv遍历文件夹