【发布时间】: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::getFirstTopLevelNode或FileStorage::root返回的节点,但是我不确定这是否可行,未经测试。 -
感谢您的回答,@michelson,我将在最后一段代码中得到的迭代器包含人员对象。和 Trasher,我们希望代码库保持小,所以没有更多的库,它应该与 opencv 一起使用!不过谢谢你的建议。