محاولة تحليل Opencv Yaml Ouput مع Yaml-CPP
-
28-09-2019 - |
سؤال
لقد حصلت على سلسلة من ملفات yaml التي تم إنشاؤها
أنا بخير على أشياء بسيطة ، لكن تمثيل المصفوفة يصعب.
# 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
. بدلاً من ذلك ، مثل:
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
الفصل يتعامل مع هذا. إذا كان لديك فئة مختلفة لكل نوع بيانات (أو فصل دراسي) ، فسيتعين عليك قراءة هذا الحقل أول, ، ثم اختر أي نوع لاستنباطه. (اذا أنت أعرف سيكون دائمًا ما يطفو ، وسيجعل حياتك أسهل ، بالطبع).