2 votes

Lecture des paramètres de l'algorithme à partir du fichier dans OpenCV

Je suis en train de lire les paramètres d'un modèle de maximisation de l'espérance entraîné à partir d'un fichier XML pour une utilisation ultérieure. Pour stocker le modèle, j'appelle

cv::FileStorage fs("model.xml", cv::FileStorage::WRITE);
classifier.write(fs);  //classifier est de type cv::EM

cela crée le fichier contenant ce qui ressemble aux données du modèle. Voici à quoi ressemble le fichier (premières lignes depuis le début):

StatModel.EM 1
<_ type_id="opencv-matrix"> 3 3 d
1.2159868951764311e+01 0. 0. 0. 0. 1.9776824566023249e-01 0. 0. 0.  .2204460492503131e-16     
<_ type_id="opencv-matrix"> 3 3 d
3.2869203526862529e+00 0. 0. 0. 1.1631692248472096e+00 0. 0. 0. 2.2204460492503131e-16     
<_ type_id="opencv-matrix"> 3 3 d
2.9815870012055705e+00 0. 0. 0. 6.5049770685681069e+03 0. 0. 0. 6.8510191786605528e+03 
<_ type_id="opencv-matrix"> 3 3 d 
4.6608996548002040e+00 0. 0. 0. 3.7558131457318683e+02 0. 0. 0. 2.2204460492503131e-16 

Remarquez que l'en-tête XML est manquant. Maintenant, pour lire les données, j'utilise

cv::FileStorage fs("model.xml", cv::FileStorage::READ);

la fonction cv::Algorithm::read() doit être appelée avec un filenode comme paramètre. Je ne suis pas sûr de quel nœud utiliser. Comme je m'attends à ce qu'il n'y ait qu'un seul nœud dans le fichier, j'ai essayé

classifier.read(fs[0]);

Mais l'algorithme n'est pas entraîné ensuite. Que dois-je faire pour restaurer les paramètres initiaux?

4voto

wl2776 Points 1607

Je utilise simplement

        const FileStorage fs(filename, FileStorage::READ);
        EM model;
        if (fs.isOpened()) {
            const FileNode& fn = fs["StatModel.EM"];
            model.read(fn);
        } 

Ça fonctionne.

3voto

Sassa Points 3177

Au lieu d'utiliser 'write', vous pouvez faire :

fs<<"my_model"<

``

et ensuite, après avoir ouvert un FileStorage pour la lecture, le lire ainsi :

cv::EM EModel;
fs["my_model"] >> EModel;

EDIT : Ce qui précède ne fonctionnera pas avec cv::EM car il n'est pas inclus dans les surcharges.

Ce lien fournit un très bon exemple de la façon dont vous écrivez et lisez une classe personnalisée depuis/vers un fichier XML/YAML. Selon cela, vous créez les méthodes "write" et "read" pour votre classe, donc c'est à vous de définir et de nommer les nœuds.

Si vous n'avez pas écrit ces méthodes vous-même et qu'elles font partie de cv::Algorithm (probablement c'est nouveau, je n'ai pas pu le trouver dans la version 2.2 que j'utilise), alors je suggérerais de vérifier le fichier XML pour voir les noms des nœuds qui ont été créés et ensuite les obtenir soit en utilisant l'opérateur >> soit en faisant :

FileNode myFilenode = fs["node_name"];
classifier.read(myFilenode);

À partir du StatModel.EM 1 <_ type_id="opencv-matrix"> que vous fournissez et de l'exemple XML dans le lien, je devinerais que le nom de ce nœud est en fait "_" (peut-être que c'est le nom par défaut si vous n'en donnez aucun lorsque vous l'écrivez)

``

1voto

Vlad Points 1836

Une syntax alternative est

    FileStorage fs(filename, FileStorage::READ);
    Mat mat;
    if (fs.isOpened()) {
        fs["mat_name"]>>mat;
    }
    fs.release();

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