【问题标题】:OpenCV YAML without knowing node names不知道节点名称的 OpenCV YAML
【发布时间】:2018-02-03 04:08:16
【问题描述】:

我可以在不知道节点名称的情况下解析 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;

【问题讨论】:

    标签: opencv yaml


    【解决方案1】:

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

    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上迭代来递归地执行此操作

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2012-07-21
          • 2012-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-04
          • 2022-12-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多