OpenCV YAML不知道节点名称

时间:2013-08-01 21:25:41

标签: opencv yaml

我可以在不知道节点名称的情况下解析OpenCV中的YAML文件(使用FileStorage库)吗?

例如,下一个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 Matrix by OpenCV Matrix),而不执行:

FileStorage fs;
...

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

3 个答案:

答案 0 :(得分:2)

要获取具有名称的任何节点中的所有密钥,您可以这样做:

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

来递归地执行此操作

答案 1 :(得分:1)

如果矩阵都映射到顶层(如示例所示),则无法在不知道其相应节点名称的情况下访问它们。 FileStorage::operator[]仅接受指定节点名称的字符串参数。

解决方法可能是使用另一种方法解析YAML以获取节点名称,然后再访问FileStorage

答案 2 :(得分:0)

我有类似的问题(here),但在我的情况下,节点不在顶层。我不认为你可以访问所有元素,但第一个元素是FileStorage::getFirstTopLevelNode

基于@Aurelius的想法,另一种解决方法可能是创建一个新的YAML文件,在该文件中转储原始YAML但在节点结构内(添加几行并增加缩进)。然后,您可以读取新的YAML文件,检索第一个节点并使用FileNodeIterator获取其余数据。即使不知道名称,这也可以让您访问元素。