不知道节点名称的OpenCV YAML

不知道节点名称的OpenCV YAML,opencv,yaml,Opencv,Yaml,我是否可以在不知道节点名称的情况下解析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矩阵逐OpenC

我是否可以在不知道节点名称的情况下解析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;

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

一种解决方法是使用另一种方法解析YAML以获取节点名,然后在之后访问
文件存储。

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


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

要获取任何节点中具有名称的所有密钥,可以执行以下操作:

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;
}
cv::FileStorage pfs(fileToRead,cv::FileStorage::READ);
cv::FileNode fn=pfs.root();
对于(cv::FileNodeIterator fit=fn.begin();fit!=fn.end();++fit)
{
cv::FileNode项=*fit;
std::string somekey=item.name();
标准::cout