基于OpenCV编写嵌套列表YAML文件的正确性及读取问题咨询
OpenCV YAML嵌套列表问题解答
一、判断YAML输出是否正确
首先,YAML的正确性核心看是否符合YAML语法规范,OpenCV的cv::FileStorage生成的YAML通常是合规的,但如果看起来怪异,你可以对照这几点检查:
- 必须有正确的YAML头:
%YAML:1.0(OpenCV会自动添加) - 嵌套列表的缩进必须统一(用空格,不能混tab,YAML对缩进敏感)
- 序列元素必须以
-开头,比如:
这种结构就是完全正确的。如果你的输出是类似上面的格式,哪怕看起来“怪异”(比如缩进较多),其实是符合规范的,OpenCV读取时能正确识别。如果出现符号不匹配(比如括号没闭合)、缩进混乱,那才是错误的。j_00x: - [1.0, 2.0, 3.0] - [4.0, 5.0, 6.0]
二、用cv::FileNode读取j_00x下的元素
下面分两种常见的嵌套结构给出读取代码:
情况1:j_00x是序列型嵌套(即列表的列表)
假设你的YAML结构是:
%YAML:1.0 j_00x: - [0.1, 0.2] - [0.3, 0.4] - [0.5, 0.6]
读取代码如下:
#include <opencv2/core.hpp> #include <iostream> int main() { // 打开YAML文件 cv::FileStorage fs("your_config.yaml", cv::FileStorage::READ); if (!fs.isOpened()) { std::cerr << "Failed to open file!" << std::endl; return -1; } // 获取j_00x对应的FileNode cv::FileNode j_node = fs["j_00x"]; if (j_node.empty()) { std::cerr << "j_00x not found in file!" << std::endl; fs.release(); return -1; } // 遍历所有嵌套元素 for (cv::FileNodeIterator it = j_node.begin(); it != j_node.end(); ++it) { // 假设每个元素是二维数组,读取到cv::Mat中 cv::Mat elem_mat; *it >> elem_mat; std::cout << "Element: " << elem_mat << std::endl; // 如果是一维数值列表,也可以读取到vector中 // std::vector<double> elem_vec; // *it >> elem_vec; // 处理elem_vec... } // 也可以按索引直接访问(如果知道元素数量) cv::Mat first_elem; j_node[0] >> first_elem; std::cout << "First element: " << first_elem << std::endl; fs.release(); return 0; }
情况2:j_00x是映射型嵌套(即键值对的嵌套)
如果你的YAML是带键名的嵌套结构,比如:
%YAML:1.0 j_00x: sub_item_1: [1, 2, 3] sub_item_2: [4, 5, 6]
读取方式如下:
// 打开文件和获取j_node的步骤同上... // 读取指定键的元素 cv::FileNode sub_node = j_node["sub_item_1"]; if (!sub_node.empty()) { cv::Mat sub_mat; sub_node >> sub_mat; std::cout << "sub_item_1: " << sub_mat << std::endl; } // 遍历所有键值对 for (cv::FileNodeIterator it = j_node.begin(); it != j_node.end(); ++it) { std::cout << "Key: " << it->name() << std::endl; cv::Mat elem_mat; *it >> elem_mat; std::cout << "Value: " << elem_mat << std::endl; }
内容的提问来源于stack exchange,提问作者infoclogged
相关产品推荐
相关产品推荐

