gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:14:20 29 4
gpt4 key购买 nike

我有一系列 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如何解析它。

最佳答案

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

关于yaml-cpp - 尝试使用 yaml-cpp 解析 OpenCV YAML 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2675092/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com