3

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 のドキュメントをいくつか探しましたが、解析と出力に関する簡単な紹介例を除いて、何もないようです。残念ながら、この特定の状況では、これら 2 つのどちらも役に立ちません。

私が理解しているように、!! これがユーザー定義型であることを示していますが、yaml-cpp でそれを解析する方法がわかりません。

4

1 に答える 1

4

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クラスがこれをどのように処理するかに大きく依存します。データ型ごとに異なるクラス (またはテンプレート化されたクラス) がある場合は、まずそのフィールドを読み取ってから、インスタンス化する型を選択する必要があります。(もちろん、常にフロートになることがわかっている場合は、作業が楽になります。)

于 2010-04-20T16:55:15.447 に答える