代码之家  ›  专栏  ›  技术社区  ›  Kenn Sebesta

尝试用YAML cpp解析OpenCV YAML输出

  •  3
  • Kenn Sebesta  · 技术社区  · 14 年前

    我有一系列OpenCv生成的YAML文件,并希望用yamlcpp解析它们

    # Center of table
    tableCenter: !!opencv-matrix
       rows: 1
       cols: 2
       dt: f
       data: [ 240,    240]
    

    这应该映射到向量中

    240
    240
    

    带类型 . 我的代码看起来像:

    #include "yaml.h"
    #include <fstream>
    #include <string>
    
    struct Matrix {
        int x;
    };
    
    void operator >> (const YAML::Node& node, Matrix& matrix) {
       unsigned rows;
       node["rows"] >> rows;
    }
    
    int main()
    {
       std::ifstream fin("monsters.yaml");
       YAML::Parser parser(fin);
       YAML::Node doc;
    
        Matrix m;
        doc["tableCenter"] >> m;
    
       return 0;
    }
    

    但我明白了

    terminate called after throwing an instance of 'YAML::BadDereference'
      what():  yaml-cpp: error at line 0, column 0: bad dereference
    Abort trap
    

    据我所知 !!

    1 回复  |  直到 14 年前
        1
  •  4
  •   Jesse Beder    14 年前

    你必须告诉我 yaml-cpp 如何解析此类型。由于C++不是动态类型化的,它不能检测你想要的数据类型并从头开始创建它——你必须直接告诉它。标记节点实际上只针对您自己,而不是解析器(它只会忠实地为您存储它)。

    我不确定OpenCV矩阵是如何存储的,但如果是这样的:

    class Matrix {
    public:
       Matrix(unsigned r, unsigned c, const std::vector<float>& d): rows(r), cols(c), data(d) { /* init */ }
       Matrix(const Matrix&) { /* copy */ }
       ~Matrix() { /* delete */ }
       Matrix& operator = (const Matrix&) { /* assign */ }
    
    private:
       unsigned rows, cols;
       std::vector<float> data;
    };
    

    然后你可以写一些

    void operator >> (const YAML::Node& node, Matrix& matrix) {
       unsigned rows, cols;
       std::vector<float> data;
       node["rows"] >> rows;
       node["cols"] >> cols;
       node["data"] >> data;
       matrix = Matrix(rows, cols, data);
    }
    

    编辑 看来你在这之前都没事;但是您缺少解析器将信息加载到 YAML::Node . 取而代之的是:

    std::ifstream fin("monsters.yaml");
    YAML::Parser parser(fin);
    YAML::Node doc;
    parser.GetNextDocument(doc); // <-- this line was missing!
    
    Matrix m;
    doc["tableCenter"] >> m;
    

    注:我猜 dt: f 表示“数据类型为浮点型”。如果真是这样,那就要看 Matrix 第一 ,然后选择要实例化的类型(如果你