cv::FileStorage
是 OpenCV 中的一个类,用于读取和写入结构化数据(如 YAML、XML、JSON)。它非常适合保存和加载诸如:
相机内参(K
、D
)
位姿(R
、T
)
IMU 数据
配置参数
向量、矩阵、图像、列表等
保存相机标定参数(标定后得到的 .yml
文件)
配置文件读写(如 SLAM、AR、CV 项目)
记录检测结果或轨迹数据
#include
using namespace cv;
int main() {
FileStorage fs("camera.yml", FileStorage::WRITE);
Mat K = (Mat_(3,3) << 1000, 0, 640,
0, 1000, 360,
0, 0, 1);
Mat D = (Mat_(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-matrix
rows: 3
cols: 3
dt: d
data: [1000, 0, 640, 0, 1000, 360, 0, 0, 1]
distortion_coefficients: !!opencv-matrix
rows: 1
cols: 5
dt: d
data: [0.1, -0.05, 0, 0, 0]
#include
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 类型,无需格式转换 |