XML 和 YAML/YML 是两种常用的数据序列化格式,用于存储和读取结构化数据。以下是它们的核心区别和使用方法:
特性 | XML | YAML/YML |
---|---|---|
语法复杂度 | 标签嵌套,结构严格 | 缩进分层,更简洁 |
可读性 | 较低(冗余标签) | 较高(类似自然语言) |
文件大小 | 较大 | (标签重复) |
注释支持 | 支持 ( ) | 支持 (# 注释) |
数据类型明确性 | 需显式声明类型(如 type_id=“opencv-matrix”) | 自动推断类型,更灵活 |
适用场景 | 需要严格结构或兼容旧系统 | 需要可读性和简洁性的配置文件 |
写入数据示例
#include
void saveData(const std::string& filename) {
cv::FileStorage fs(filename, cv::FileStorage::WRITE);
// 写入基本数据类型
fs << "frameCount" << 100;
fs << "resolution" << cv::Size(1920, 1080);
// 写入矩阵(如相机矩阵)
cv::Mat cameraMatrix = (cv::Mat_(3,3) <<
1000, 0, 960,
0, 1000, 540,
0, 0, 1);
fs << "cameraMatrix" << cameraMatrix;
// 写入结构体或自定义数据
fs << "settings" << "{";
fs << "exposure" << 0.8 << "gain" << 1.2;
fs << "}";
fs.release(); // 关闭文件
}
// 调用示例:
saveData("data.xml"); // XML 格式
saveData("data.yml"); // YAML 格式
cv::FileStorage fs("data.yml", cv::FileStorage::READ);
int frameCount;
cv::Size resolution;
cv::Mat cameraMatrix;
fs["frameCount"] >> frameCount;
fs["resolution"] >> resolution;
fs["cameraMatrix"] >> cameraMatrix;
// 读取嵌套结构
cv::FileNode settings = fs["settings"];
double exposure, gain;
settings["exposure"] >> exposure;
settings["gain"] >> gain;
fs.release();
XML 示例
100
1920 1080
3
3
d
1000. 0. 960. 0. 1000. 540. 0. 0. 1.
8.0000000000000004e-01
1.2
YAML 示例
%YAML:1.0
frameCount: 100
resolution: [1920, 1080]
cameraMatrix: !!opencv-matrix
rows: 3
cols: 3
dt: d
data: [1000., 0., 960., 0., 1000., 540., 0., 0., 1.]
settings:
exposure: 8.0000000000000004e-01
gain: 1.2
选择 XML:
需要与旧版代码或工具兼容。
数据需要严格的结构验证(如通过 XSD 校验)。
选择 YAML:
需要人工编辑和阅读配置文件。
追求文件简洁性和可读性。
需要更灵活的数据结构(如动态类型)。
Q1:为何 YAML 文件中出现 !!opencv-matrix 标记?
Q2:如何避免浮点数精度损失?
fs << "exposure" << cv::format("%.16f", 0.8);
Q3:如何处理自定义类的序列化?
struct CustomData {
int id;
std::vector values;
};
void operator<<(cv::FileStorage& fs, const CustomData& data) {
fs << "{";
fs << "id" << data.id << "values" << data.values;
fs << "}";
}
void operator>>(const cv::FileNode& node, CustomData& data) {
node["id"] >> data.id;
node["values"] >> data.values;
}
统一文件扩展名:
版本控制友好:
安全性:
通过合理选择 XML/YAML 格式,您可以高效管理 OpenCV 应用的配置和数据!