尝试使用 yaml-cpp 解析 OpenCV YAML 输出

Posted

技术标签:

【中文标题】尝试使用 yaml-cpp 解析 OpenCV YAML 输出【英文标题】:Trying to parse OpenCV YAML ouput with yaml-cpp 【发布时间】:2010-04-20 12:36:35 【问题描述】:

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

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

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

这应该映射到向量中

240
240

类型为 float。我的代码如下:

#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 如何解析它。

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于尝试使用 yaml-cpp 解析 OpenCV YAML 输出的主要内容,如果未能解决你的问题,请参考以下文章

ROS交叉编译——protobuf/yaml-cpp/opencv

找到 YAML 文件,但无法解析内容

使用 yaml-cpp 解析 YAML !!timestamp(日期时间)

使用 YAML-CPP 发出解析文件

如何使用 yaml-cpp 发出和解析原始二进制数据

使用 yaml-cpp 解析 YAML 时的内存消耗