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

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.xdnf.cn/news/11861.html

相关文章:

  • 多线程爬虫使用代理IP指南
  • Java面试题及答案整理( 2025年最新版,持续更新...)
  • PARADISE:用于新生儿缺氧缺血性脑病(HIE)疾病识别与分割的个性化和区域适应性方法|文献速递-深度学习医疗AI最新文献
  • GMS地下水数值模拟及溶质(包含反应性溶质)运移模拟技术
  • Python爬虫之数据提取
  • JavaScript性能优化实战技术
  • LeetCode-934. 最短的桥
  • 【uniapp开发】picker组件的使用
  • 二叉数-965.单值二叉数-力扣(LeetCode)
  • JavaWeb:前端工程化-Vue
  • 舵机在弹簧刀无人机中的作用是什么?
  • Linux 进程调度与管理:从内核管理到调度机制的深度解析
  • 【前端AI实践】泛谈AI在前端领域的应用场景
  • Vue-Todo-list 案例
  • 【QT】-信号传输数组跨线程段错误处理
  • Go语言依赖管理与版本控制-《Go语言实战指南》
  • 【使用 Loki + Promtail + Grafana 搭建轻量级容器日志分析平台】
  • 【Linux系统】命令行参数 和 环境变量(含内建命令介绍)
  • NLP常用工具包
  • video-audio-extractor【源码版】
  • 出口合规管理
  • 在 Android Studio 中使用 GitLab 添加图片到 README.md
  • 【免费数据】1980-2022年中国2384个站点的水质数据
  • Attention Is All You Need:抛弃循环神经网络的时代来了!
  • Gateway 搭建
  • AD四层板的层叠设计
  • window 显示驱动开发-提供视频解码功能(三)
  • 飞算JavaAI 炫技赛重磅回归!用智能编码攻克老项目重构难题
  • oracle从表B更新拼接字段到表A
  • 链表题解——环形链表【LeetCode】