Pregunta

Tengo una serie de OPENCV genera archivos YAML y me gustaría analizar con yaml-CPP

Estoy bien en cosas simples, pero la representación matricial está resultando difícil.

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

Esto debe asignar en el vector

240
240

con el tipo flotador . Mi código es el siguiente:

#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;
}

Pero consigo

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

Busqué alguna documentación para yaml-CPP, pero no parece haber ninguna, aparte de un breve ejemplo introductorio sobre el análisis y emitiendo. Por desgracia, ninguno de estos dos ayuda en esta circunstancia particular.

A mi entender, la !! indica que se trata de un tipo definido por el usuario, pero no ver con yaml-CPP cómo analizar eso.

¿Fue útil?

Solución

Hay que decir yaml-cpp cómo analizar este tipo. Puesto que C ++ no se escribe de forma dinámica, no puede detectar qué tipo de datos que desee y crear desde cero - usted tiene que decirle a él directamente. Etiquetado de un nodo es realmente sólo por sí mismo, no para el analizador (sólo va a almacenar fielmente en su caso).

No estoy muy seguro de cómo se almacena una matriz de OpenCV, pero si es algo como esto:

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;
};

A continuación, se puede escribir algo como

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);
}

Editar Parece que estás bien hasta aquí; pero que se está perdiendo el paso donde el analizador carga la información en el YAML::Node. En su lugar, SE IT como:

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

Matrix m;
doc["tableCenter"] >> m;

Nota: supongo medios dt: f "tipo de datos es flotar". Si ese es el caso, lo que realmente va a depender de cómo las asas de clase Matrix esto. Si usted tiene una clase diferente para cada tipo de datos (o una clase de plantilla), usted tiene que leer ese campo primero , y luego elegir el tipo para crear una instancia. (Si sabe siempre será flotante, que va a hacer la vida más fácil, por supuesto.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top