当前位置: 首页 > article >正文

cv::FileStorage用法

cv::FileStorage 是 OpenCV 中的一个类,用于读取和写入结构化数据(如 YAML、XML、JSON)。它非常适合保存和加载诸如:

  • 相机内参(KD

  • 位姿(RT

  • IMU 数据

  • 配置参数

  • 向量、矩阵、图像、列表等


📦 常见用途

  • 保存相机标定参数(标定后得到的 .yml 文件)

  • 配置文件读写(如 SLAM、AR、CV 项目)

  • 记录检测结果或轨迹数据


📘 使用示例

✅ 1. 写入 YAML 文件

#include <opencv2/opencv.hpp>
using namespace cv;int main() {FileStorage fs("camera.yml", FileStorage::WRITE);Mat K = (Mat_<double>(3,3) << 1000, 0, 640,0, 1000, 360,0, 0, 1);Mat D = (Mat_<double>(1,5) << 0.1, -0.05, 0, 0, 0);fs << "camera_matrix" << K;fs << "distortion_coefficients" << D;fs.release();return 0;
}

写出的文件 camera.yml

%YAML:1.0
camera_matrix: !!opencv-matrixrows: 3cols: 3dt: ddata: [1000, 0, 640, 0, 1000, 360, 0, 0, 1]
distortion_coefficients: !!opencv-matrixrows: 1cols: 5dt: ddata: [0.1, -0.05, 0, 0, 0]

✅ 2. 读取 YAML 文件

#include <opencv2/opencv.hpp>
using namespace cv;int main() {FileStorage fs("camera.yml", FileStorage::READ);Mat K, D;fs["camera_matrix"] >> K;fs["distortion_coefficients"] >> D;std::cout << "K =\n" << K << std::endl;std::cout << "D =\n" << D << std::endl;fs.release();return 0;
}

✅ 支持的数据类型

  • 基本类型:int, float, double, std::string

  • 容器:std::vector, cv::Mat, cv::Point, cv::Size, cv::Rect, cv::Scalar

  • 嵌套结构、映射(通过 {}[]

  • JSON 格式(OpenCV ≥ 3.0 支持)


🧪 典型应用场景

场景示例
相机标定保存相机内参到 .yml/.xml 文件
SLAM配置加载参数如图像大小、频率等
多视图几何存储基础矩阵、变换矩阵
校准/跟踪系统保存历史轨迹、估计姿态数据

✅ 文件格式支持

格式后缀Open 方法
YAML.yml, .yamlFileStorage("file.yml", FileStorage::READ)
XML.xml同上
JSON.json需要 OpenCV 支持 JSON 的版本(≥3)

🚨 注意事项

  • 读取后记得 .release() 释放文件

  • 文件路径要正确,尤其在嵌入式/移动设备上

  • 大文件建议使用 JSON 或 YAML,避免 XML 臃肿


📌 总结

功能cv::FileStorage 优势
读写结构化数据一行代码搞定 YAML、XML 或 JSON
支持丰富数据类型向量、矩阵、图像、字典、数组
易于配置与共享常用于校准参数存储、SLAM配置等
C++ 集成度高直接读取 OpenCV 类型,无需格式转换

http://www.lryc.cn/news/2404847.html

相关文章:

  • Go 语言 := 运算符详解(短变量声明)
  • 【优选算法】C++滑动窗口
  • 关于GitHub action云编译openwrt
  • 数据库学习(二)——MySQL语句
  • AI Agent 架构设计:ReAct 与 Self-Ask 模式对比与分析
  • sql入门语句-案例
  • A Survey on the Memory Mechanism of Large Language Model based Agents
  • 华为OD机试 - 猴子吃桃 - 二分查找(Java 2025 B卷 200分)
  • 提取数据区域中表格
  • 【设计模式-5】设计模式的总结
  • 【无人机】无人机UAV、穿越机FPV的概念介绍,机型与工具,证书与规定
  • 链表好题-多种实现
  • oracle数据恢复—oracle数据库执行truncate命令后的怎么恢复数据?
  • OneNet + openssl + MTLL
  • 分享两个日常办公软件:uTools、PixPin
  • Golang基础学习
  • [学习] GNSS信号跟踪环路原理、设计与仿真(仿真代码)
  • Python实例题:Python计算微积分
  • 如何判断指针是否需要释放?
  • Spark 之 AQE
  • 随访系统安装的记录
  • NLP学习路线图(二十四):门控循环单元(GRU)
  • Doris查询Hive数据:实现高效跨数据源分析的实践指南
  • vsCode使用本地低版本node启动配置文件
  • 在Ubuntu上使用 dd 工具制作U盘启动盘
  • el-table表格增加序号列index vue2和vue3的写法
  • 【学习记录】如何使用 Python 提取 PDF 文件中的内容
  • Spark 之 DataFrame 开发
  • 嵌入式学习笔记 - freeRTOS xTaskResumeAll( )函数解析
  • 机器学习KNN算法全解析:从原理到实战