我可以在不知道节点名称的情况下解析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;
答案 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
获取其余数据。即使不知道名称,这也可以让您访问元素。