【问题标题】:How to retrieve the key-value pairs from an OpenCV FileNode map?如何从 OpenCV FileNode 映射中检索键值对?
【发布时间】:2013-05-07 10:28:36
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你应该看看使用FileNodeIterator。我不准备写一个完整的答案,但是当您遍历fn 中的每个FileNode mapFn 时,我希望mapFn.isNamed()true,而mapFn.name() 给出实际名称。虽然我还没有尝试过,但我很确定这些方面的东西应该适合你。
  • 感谢@SchighSchagh 的提示,你是对的。

标签: c++ opencv file-storage


【解决方案1】:

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

有必要使用cv::FileNodeIterator 遍历节点并稍后将其转换为cv::FileNode。然后将密钥存储为此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;
  ...
}

重要的是要意识到fit-&gt;name() 符号不适用于cv::FileNodeIterator

【讨论】:

  • 箭头操作符实际上应该可以按预期工作,您在使用时是否遇到任何错误?
  • 在使用 OpenCV 2.4.3 执行 fit-&gt;name() 时出现编译错误:error: result of ‘operator-&gt;()’ yields non-pointer result
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多