3 votes

OpenCV YAML sans connaître les noms des nœuds

Puis-je analyser un fichier YAML dans OpenCV (en utilisant la bibliothèque FileStorage) sans connaître le nom des nœuds ?

Par exemple, le fichier YAML suivant :

%YAML:1.0
descriptors1: !!opencv-matrix
   rows: 82
   cols: 64
   dt: f
   data: [ ... ]
descriptors2: !!opencv-matrix
   rows: 161
   cols: 64
   dt: f
   data: [ ... ]

et parse, noeud par noeud (OpenCV Matrix par OpenCV Matrix), sans faire :

FileStorage fs;
...

Mat firstMatrix;
Mat secondMatrix;
fs["descriptors1"] >> firstMatrix;    
fs["descriptors2"] >> secondMatrix;

4voto

Alvise Points 81

Pour obtenir toutes les clés de n'importe quel nœud, qui ont un nom, vous pouvez faire comme ceci :

cv::FileStorage pfs(fileToRead, cv::FileStorage::READ);
cv::FileNode fn = pfs.root();
for (cv::FileNodeIterator fit = fn.begin(); fit != fn.end(); ++fit)
{
    cv::FileNode item = *fit;
    std::string somekey = item.name();
    std::cout << somekey << std::endl;
}

Vous pouvez également faire cela de manière récursive en itérant sur le noeud de fichier item

1voto

Aurelius Points 10621

Si les matrices sont toutes mappées au niveau supérieur (comme dans votre exemple), il n'y a aucun moyen d'y accéder sans connaître le nom des nœuds correspondants. FileStorage::operator[] ne prend que des arguments de type chaîne spécifiant le nom du nœud.

Une solution de contournement pourrait être d'analyser le YAML avec une autre méthode pour obtenir les noms des nœuds, puis d'accéder à l'élément de données de la base de données de l'utilisateur. FileStorage après.

0voto

ChronoTrigger Points 2788

J'ai eu un problème similaire ( aquí ), mais dans mon cas, les nœuds ne se trouvaient pas au niveau supérieur. Je ne pense pas que vous puissiez accéder à tous les éléments, mais le premier avec FileStorage::getFirstTopLevelNode .

En se basant sur l'idée de @Aurelius, une autre solution pourrait être de créer un nouveau fichier YAML dans lequel vous déposez votre YAML original mais à l'intérieur d'une structure de nœuds (en ajoutant quelques lignes et en augmentant l'indentation). Ensuite, vous pouvez lire le nouveau fichier YAML, récupérer le premier nœud et obtenir le reste des données avec une commande FileNodeIterator . Cela devrait vous permettre d'accéder aux éléments même sans en connaître les noms.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X