3

我可以在不知道节点名称的情况下解析 OpenCV 中的 YAML 文件(使用 FileStorage 库)吗?

例如,下一个 YAML 文件:

%YAML:1.0
descriptors1: !!opencv-matrix
   rows: 82
   cols: 64
   dt: f
   data: [ ... ]
descriptors2: !!opencv-matrix
   rows: 161
   cols: 64
   dt: f
   data: [ ... ]

并逐个节点解析(OpenCV Matrix by OpenCV Matrix),无需执行:

FileStorage fs;
...

Mat firstMatrix;
Mat secondMatrix;
fs["descriptors1"] >> firstMatrix;    
fs["descriptors2"] >> secondMatrix;
4

3 回答 3

4

要获取任何节点中具有名称的所有键,您可以这样做:

cv::FileStorage pfs(fileToRead, cv::FileStorage::READ);
cv::FileNode fn = pfs.root();
for (cv::FileNodeIterator fit = fn.begin(); fit != fn.end(); ++fit)
{
    cv::FileNode item = *fit;
    std::string somekey = item.name();
    std::cout << somekey << std::endl;
}

您也可以通过在文件节点上迭代来递归地执行此操作item

于 2018-02-02T20:08:16.750 回答
1

如果矩阵都映射到顶层(如您的示例中),则无法在不知道其相应节点名称的情况下访问它们。FileStorage::operator[]只接受指定节点名称的字符串参数。

一种解决方法可能是使用另一种方法解析 YAML 以获取节点名称,然后再访问FileStorage

于 2013-08-01T23:25:04.593 回答
0

我有一个类似的问题(here),但在我的情况下,节点不在顶层。我不认为您可以访问所有元素,但第一个带有FileStorage::getFirstTopLevelNode.

根据@Aurelius 的想法,另一种解决方法可能是创建一个新的 YAML 文件,您可以在其中转储原始 YAML,但在节点结构内(添加几行并增加缩进)。然后,您可以读取新的 YAML 文件,检索第一个节点并使用FileNodeIterator. 这应该使您即使不知道名称也可以访问元素。

于 2013-08-02T11:21:29.067 回答