質問

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

私が理解しているように、 !! これはユーザー定義のタイプであることを示しますが、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 クラスはこれを処理します。各データ型(またはテンプレートクラス)に異なるクラスがある場合、そのフィールドを読む必要があります 最初, 、次に、インスタンス化するタイプを選択します。 (もし、あんたが 知る もちろん、それは常に浮かぶでしょう、それはあなたの人生を楽にします。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top