【问题标题】:FileNodeIterator opencv c++FileNodeIterator opencv c++
【发布时间】:2020-12-15 03:59:02
【问题描述】:

我在读取以 yaml 格式存储的对象时确实存在问题。 如您所见(如下),我存储了一个 std::vector,其中包含一些包含 cv::Point、概率、有效性和自身 ID 的肢体。

person:
   - Nose
   -
      Point: [ 0, 0 ]
      Proba: 0.
      IsValid: 0
      LimbId: 0
   - Neck
   -
      Point: [ 0, 0 ]
      Proba: 0.
      IsValid: 0
      LimbId: 1
person:
...

存储功能看起来像这样,并且由于文件输出而似乎可以工作:

    void person::write(cv::FileStorage & fs)
    {
        for (int limbIndex = 0; limbIndex <= 17; limbIndex++) {
            fs << getLimbName(limbIndex) << "{";
            fs << "Point" << getLimb(limbIndex).point;
            fs << "Proba" << getLimb(limbIndex).probability;
            fs << "IsValid" << getLimb(limbIndex).isValid;
            fs << "LimbId" << getLimb(limbIndex).limbId;
            fs << "}";
        }
    }

不幸的是,我不确定如何读回 yaml 文件,因为它包含一个人员列表,其中包含一个肢体列表。我从中读取的最佳方式似乎是来自:yaml persistence 的 FileNodeIterator。

到目前为止,我会这样做:

cv::FileNode personEntries = fileStorage["person"];
cv::FileNodeIterator it = personEntries.begin(), it_end = personEntries.end();
for (; it != it_end; ++it, idx++) {
// should now have one person from the yaml file
}

如何将位于一个人的肢体也作为 FileNodeIterator 获取? 以及如何从 cv::FileNode 读取 cv::Point?

感谢您的帮助!

【问题讨论】:

  • 总的来说,我认为您应该在某种父节点中拥有一个persons 列表。否则,您可以尝试遍历FileStorage::getFirstTopLevelNodeFileStorage::root 返回的节点,但是我不确定这是否可行,未经测试。
  • 也许看看这里YAML serialization library
  • 感谢您的回答,@michelson,我将在最后一段代码中得到的迭代器包含人员对象。和 Trasher,我们希望代码库保持小,所以没有更多的库,它应该与 opencv 一起使用!不过谢谢你的建议。

标签: c++ opencv yaml


【解决方案1】:

我设法找到了一个解决方案,首先,保存人员需要是一个列表 - 因此使用“[person1,person2 ...]”方括号来包围对象,然后我们可以使用FileNoteIterator:

        cv::FileNodeIterator it = personEntries.begin(), it_end = personEntries.end();
        int idx = 0;
        for (; it != it_end; ++it, idx++) {
            person p;
            p.read(*it);
            persons.push_back(p);
        }

人本身的不同成员变量可以存储为地图。因此我们必须使用弯括号“{ Limb1, Limb2 ... }”。现在每个肢体都有自己的属性,我们也必须保存为地图! “{Point : Value ....}”等

第二个问题是从文件中读取 cv::Point 对象。它似乎只适用于管道。

LimbNode["Point"] >> pt;

就是这样。

【讨论】:

    猜你喜欢
    • 2014-02-08
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 2018-06-08
    相关资源
    最近更新 更多