我有一系列OPENCV生成的YAML文件,并想用yaml-cpp解析它们

我在简单的东西上做得很好,但是矩阵表示很难。

# 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

我四处寻找一些文档,以了解YAML-CPP,但是除了简短的解析和发射示例外,似乎没有任何文档。不幸的是,这两个在这种特殊情况下都没有帮助。

据我了解, !! 表明这是一种用户定义的类型,但是我看不到YAML-CPP如何解析。

有帮助吗?

解决方案

你必须告诉 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 班级处理这个。如果您对每种数据类型(或模板类)有不同的类,则必须阅读该字段 第一的, ,然后选择要实例化的类型。 (如果你 知道 当然,它总是会浮动,这会使您的生活更轻松。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top