cv::FileStorage 是 OpenCV 中的一个类,用于读取和写入结构化数据(如 YAML、XML、JSON)。它非常适合保存和加载诸如:
-
相机内参(
K、D) -
位姿(
R、T) -
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, .yaml | FileStorage("file.yml", FileStorage::READ) |
| XML | .xml | 同上 |
| JSON | .json | 需要 OpenCV 支持 JSON 的版本(≥3) |
🚨 注意事项
-
读取后记得
.release()释放文件 -
文件路径要正确,尤其在嵌入式/移动设备上
-
大文件建议使用 JSON 或 YAML,避免 XML 臃肿
📌 总结
| 功能 | cv::FileStorage 优势 |
|---|---|
| 读写结构化数据 | 一行代码搞定 YAML、XML 或 JSON |
| 支持丰富数据类型 | 向量、矩阵、图像、字典、数组 |
| 易于配置与共享 | 常用于校准参数存储、SLAM配置等 |
| C++ 集成度高 | 直接读取 OpenCV 类型,无需格式转换 |