2010-04-20 33 views
3

我有一系列的OpenCV的產生YAML文件,並願與YAML-CPP試圖解析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如何解析該類型。

回答

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的步驟。相反,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類如何處理這個問題。如果您對每種數據類型(或模板類)都有不同的類,則必須先讀取的第一個,然後選擇要實例化的類型。 (如果你知道它將永遠是浮動的,當然會讓你的生活更輕鬆。)