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 類型,無需格式轉換 |