Пытаясь анализировать opencv yaml Ouput с yaml-cpp

StackOverflow https://stackoverflow.com/questions/2675092

  •  28-09-2019
  •  | 
  •  

Вопрос

У меня есть серия 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. Отказ Вместо этого, SE это нравится:

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