opencv学习笔记——FileStorage类的数据存取操作
2023-09-11 14:18:37 时间
OpenCV的许多应用都需要使用数据的存储于读取,例如经过3D校准后的相机,需要存储校准结果矩阵,以方便下次调用该数据;基于机器学习的应用,同样需要将学习得到的参数保存等。OpenCV通过XML/YAML格式实现数据持久化。本文简要梳理了使用FileStorage类进行基本数据持久化操作,给出了示例代码。
主要内容包括:
FileStorage类
- 构造函数
- operator <<
- FileStorage::open
- FileStorage::isOpened
- FileStorage::release
- FileStorage::getFirstTopLevelNode
- FileStorage::root
- FileStorage::operator[]
示例代码
- 创建写入器、创建读取器
- 写入数值、写入矩阵、写入自定义数据结构、写入当前时间
- 读取数值、读取矩阵、读取自定义数据结构、读取当前时间
- 关闭写入器、关闭读取器
FileStorage类
FileStorage类将各种OpenCV数据结构的数据存储为XML 或 YAML格式。同时,也可以将其他类型的数值数据存储为这两种格式。
构造函数
FileStorage类的构造函数为:
cv::FileStorage(const string& source, int flags, const string& encoding=string());
参数:
source –存储或读取数据的文件名(字符串),其扩展名(.xml 或 .yml/.yaml)决定文件格式。
flags – 操作模式,包括:
- FileStorage::READ 打开文件进行读操作
- FileStorage::WRITE 打开文件进行写操作
- FileStorage::APPEND打开文件进行附加操作
- FileStorage::MEMORY 从source读数据,或向内部缓存写入数据(由FileStorage::release返回)
encoding – 文件编码方式。目前不支持UTF-16 XML 编码,应使用 8-bit 编码。
写数据operator <<
向filestorage中写入数据
template<typename_Tp> FileStorage& operator<<(FileStorage& fs, const _Tp& value) template<typename_Tp> FileStorage& operator<<(FileStorage& fs, const vector<_Tp>& vec)参数:
fs – 已经打开的用于写数据的file storage对象
value – 待写入fs 的数据.
vec – 待写入fs 的向量值
以下代码分别演示写入数值、矩阵、多个变量、当前时间和关闭文件:
// 1.create our writter cv::FileStorage fs("test.yml", FileStorage::WRITE); // 2.Save an int int imageWidth= 5; int imageHeight= 10; fs << "imageWidth" << imageWidth; fs << "imageHeight" << imageHeight; // 3.Write a Mat cv::Mat m1= Mat::eye(3,3, CV_8U); cv::Mat m2= Mat::ones(3,3, CV_8U); cv::Mat resultMat= (m1+1).mul(m1+2); fs << "resultMat" << resultMat; // 4.Write multi-variables cv::Mat cameraMatrix = (Mat_<double>(3,3) << 1000, 0, 320, 0, 1000, 240, 0, 0, 1); cv::Mat distCoeffs = (Mat_<double>(5,1) << 0.1, 0.01, -0.001, 0, 0); fs << "cameraMatrix" << cameraMatrix << "distCoeffs" << distCoeffs; // 5.Save local time time_t rawtime; time(&rawtime); //#include <time.h> fs << "calibrationDate" << asctime(localtime(&rawtime)); // 6.close the file opened fs.release();
FileStorage::open
打开一个文件
boolFileStorage::open(const string& filename, int flags, const string&encoding=string())参数: filename – 待打开的文件名,其扩展名(.xml 或 .yml/.yaml) 决定文件格式(XML 或 YAML) flags – 操作模式。见构造函数 encoding – 文件编码方式。// open a file cv::FileStorage fs; fs.open("test.yml",FileStorage::WRITE); // ... some process here fs.release();
相关文章
- Opencv学习笔记 基于Haar级联的人脸检测/识别
- Opencv学习笔记 - 使用opencvsharp和期望最大化
- Opencv学习笔记 - 使用opencvsharp和Boosting算法处理分类问题
- Opencv学习笔记 - DNN模块调用Caffe的人脸识别模型
- Opencv学习笔记 - 使用opencvsharp和多层感知器
- Opencv学习笔记 高动态范围 (HDR) 成像
- Opencv学习笔记 使用LineIterator遍历两点直线上的所有点
- Opencv学习笔记 边缘检测
- Opencv学习笔记 模拟长曝光效果
- Opencv学习笔记 - 频域手段添加盲水印
- Opencv学习笔记 均方误差(MSE)、结构相似度指数(SSIM)
- 机器学习笔记 - Kornia:结合OpenCV的PyTorch框架
- 机器学习笔记 - 使用opencv的基于深度学习的超分辨率图像处理
- 成功解决sub_div.insert(points)cv2.error: OpenCV(3.4.1) C:projectsopencv-pythonopencvmodulesimgproc
- OpenCV(C++接口)学习笔记1-图像读取、显示、保存
- Python学习笔记十之Opencv图像处理:阈值、滤波、形态学、梯度、轮廓提取、FFT