如何从 OpenCV FileNode 映射中检索键值对?

Chr*_*ger 2 c++ opencv file-storage

我使用 OpenCV FileStorage 将地图存储在 yaml 文件中,如下所示:

cv::FileStorage fs("file.yaml.gz", cv::FileStorage::WRITE);
std::string somekey = ...;
double someval = ...;
fs << "mymap" << "{:" << somekey << someval << "}";
Run Code Online (Sandbox Code Playgroud)

现在,我想取回数据,但我不知道地图的键。我想代码应该是这样的:

cv::FileStorage fs("file.yaml.gz", cv::FileStorage::READ);
cv::FileNode fn = fs["mymap"];
// fn has type == cv::FileNode::MAP
// fn has size == 1 element (one pair)
// fn[0] returns also a MAP with 1 element
Run Code Online (Sandbox Code Playgroud)

是否可以在没有密钥的情况下获得该地图的所有对?我已经检查过cv::FileNodeIterator,但似乎没有解决这个问题。C 接口CvFileNode允许在提供密钥后检索值。

Chr*_*ger 5

感谢@SchighSchagh,我找到了答案。

有必要使用 a 迭代节点cv::FileNodeIterator,然后将其转换为 a cv::FileNode。然后将密钥存储为 this 的名称cv::FileNode

cv::FileStorage fs("file.yaml.gz", cv::FileStorage::READ);
cv::FileNode fn = fs["mymap"];

for(cv::FileNodeIterator fit = fn.begin(); fit != fn.end(); ++fit)
{
  cv::FileNode item = *fit;
  std::string somekey = item.name();
  double someval = (double)item;
  ...
}
Run Code Online (Sandbox Code Playgroud)

重要的是要认识到该表示法fit->name()不适用于cv::FileNodeIterator.