cv::FileStorage用法

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

  • 相机内参(KD

  • 位姿(RT

  • IMU 数据

  • 配置参数

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


常见用途

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

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

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


使用示例

✅ 1. 写入 YAML 文件

#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]

✅ 2. 读取 YAML 文件

#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 类型,无需格式转换

你可能感兴趣的:(c++,c++,开发语言,opencv)