2013-08-01 89 views
3

我可以在不知道節點名稱的情況下解析OpenCV中的YAML文件(使用FileStorage庫)嗎?OpenCV YAML不知道節點名稱

例如,下一個YAML文件:

%YAML:1.0 
descriptors1: !!opencv-matrix 
    rows: 82 
    cols: 64 
    dt: f 
    data: [ ... ] 
descriptors2: !!opencv-matrix 
    rows: 161 
    cols: 64 
    dt: f 
    data: [ ... ] 

和解析,由節點(OpenCV的矩陣由OpenCV的矩陣)節點,而不做:

FileStorage fs; 
... 

Mat firstMatrix; 
Mat secondMatrix; 
fs["descriptors1"] >> firstMatrix;  
fs["descriptors2"] >> secondMatrix; 

回答

1

如果矩陣都被映射到頂層(如你的例子),沒有一個方法來訪問他們不知道其相應的節點的名稱。 FileStorage::operator[]只接受指定節點名稱的字符串參數。

解決方法是用另一種方法解析YAML以獲取節點名稱,然後再訪問FileStorage

0

我有類似的問題(here),但在我的情況下,節點不在頂層。我不認爲你可以訪問所有的元素,但第一個與FileStorage::getFirstTopLevelNode

基於@Aurelius的想法,另一個解決方法是創建一個新的YAML文件,在該文件中轉儲原始YAML,但在節點結構中(添加幾行並增加縮進)。然後,您可以讀取新的YAML文件,檢索第一個節點並使用FileNodeIterator獲取其餘數據。這應該讓你訪問元素,即使不知道名稱。

1

爲了獲得任何節點的所有按鍵,其中有一個名字,你可以這樣做:

cv::FileStorage pfs(fileToRead, cv::FileStorage::READ); 
cv::FileNode fn = pfs.root(); 
for (cv::FileNodeIterator fit = fn.begin(); fit != fn.end(); ++fit) 
{ 
    cv::FileNode item = *fit; 
    std::string somekey = item.name(); 
    std::cout << somekey << std::endl; 
} 

你也可以做到這一點遞歸是通過遍歷文件節點上item

相關問題