cv::FileStorage用法
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 类型,无需格式转换 |