使用不同的键/文件节点读取.yml文件的有效方法

时间:2017-06-04 00:01:39

标签: c++ opencv yaml

我有一个yaml文件,格式如下:

%YAML:1.0

data1: !!opencv-matrix
rows: 50
cols: 3
dt: d
data: [ 7.1709999084472656e+01, ...

data2: !!opencv-matrix
rows: 50
cols: 3
dt: d
data: [ 7.1709999084472656e+01, ...

dataN: ...

我读取文件内容并将不同的数据保存在不同的Mats中:

QString nodeName[m_NameList.count()]= "data";
QString fullName[m_NameList.count()];
Mat inMat[m_NameList.count()];

for(int i= 0; i< m_NameList.count(); ++i)
{
    fullName[i]= nodeName[i].append(QString::number(i+1));

    FileStorage fsIn("file.yml", CV_STORAGE_READ);
    fsIn[fullName[i].toStdString()] >> inMat[i];
}

我的问题是如果我想将其提供给= "data";,则定义节点名称FileStorage。有没有其他方式FileStorage自动识别文件节点?

1 个答案:

答案 0 :(得分:0)

好的,我自己找到了解决方案,如果其他人感兴趣的话,自动从yaml文件中读取我的节点名称。基本上我在QStringList::iterator上迭代节点名称并将其写在FileNode中并使用fileNode.name()函数获取它们。

int idx= 0;
FileStorage fs("file.yml", CV_STORAGE_READ);
FileNode fileNode;
Mat inMat[m_NameList.count()];

for(QStringList::iterator it= m_NameList.begin(); it!= m_NameList.end(); ++it)
{
  fileNode= fs[(*it).toStdString()];

  string key= fileNode.name();
  fs[key] >> inMat[idx];
  cout<<"Key Name: " << key << " Mat: " << inMat[idx]<<endl;
}