Добавить элемент в файл xml в opencv с помощью cpp

Я пытаюсь добавить новый элемент в мой файл opencv xml, который уже имеет один элемент, как показано ниже.

<?xml version="1.0"?>
<opencv_storage>
<acc type_id="opencv-ml-ann-mlp">
...
</_></weights></acc>
</opencv_storage>

Я пытаюсь добавить еще один элемент с именем micr, как показано ниже.

<?xml version="1.0"?>
<opencv_storage>
<acc type_id="opencv-ml-ann-mlp">
...
</_></weights></acc>
  <micr type_id="opencv-ml-ann-mlp">
...
</_></weights></micr>
</opencv_storage>

Но то, что я получаю, это

<?xml version="1.0"?>
<opencv_storage>
<acc type_id="opencv-ml-ann-mlp">
...
  <micr type_id="opencv-ml-ann-mlp">
...
</_></weights></micr></_></weights></acc>
</opencv_storage>

Я использую cv::FileStorage из opencv.

Я хочу знать, что не так с ::APPEND и есть ли какая-либо альтернатива для достижения этого.

Вот код:

cv::FileStorage f("OCR.xml", cv::FileStorage::WRITE);
...
ann.write(*f, "acc");    //In another function
...
f.release();

cv::FileStorage f("OCR.xml", cv::FileStorage::APPEND);
...
ann.write(*f, "micr");    //In another function
...
f.release();

Заранее спасибо!


person Sujit    schedule 16.01.2016    source источник
comment
Пожалуйста, покажите нам код, который вы используете, т. е. минимально воспроизводимый пример, или невозможно узнать, где вы находитесь. делать неправильно.   -  person Miki    schedule 16.01.2016
comment
Привет, Мики, я добавил код, пожалуйста, проверьте.   -  person Sujit    schedule 16.01.2016


Ответы (1)


Пожалуйста, попробуйте этот фрагмент. Кажется, он работает так, как ожидалось.

#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;

int main()
{
    Mat layers = (Mat1i(2,1) << 5, 15);
    CvANN_MLP ann(layers);

    {
        FileStorage f("OCR.xml", FileStorage::WRITE);
        ann.write(*f, "acc");
    }
    {
        FileStorage f("OCR.xml", FileStorage::APPEND);
        ann.write(*f, "micr");
    }

    FileStorage f("OCR.xml", FileStorage::READ);

    CvANN_MLP ann_acc;
    ann_acc.read(*f, cvGetFileNodeByName(*f, NULL, "acc"));

    CvANN_MLP ann_micr;
    ann_acc.read(*f, cvGetFileNodeByName(*f, NULL, "micr"));

    return 0;

    return 0;
}

См. также здесь, что не следует смешивать сохранение/загрузку с записью/чтением.

person Miki    schedule 16.01.2016
comment
‹/_›‹/weights›‹/acc› ‹!-- возобновлено --› ‹micr type_id=opencv-ml-ann-mlp› Это не помогает, когда я пытаюсь сделать это nnAcc.load(OCR.xml , соотв.); annMICR.load(OCR.xml, микро); Это дает мне плохую ошибку аргумента, о которой вы могли знать. - person Sujit; 16.01.2016
comment
Эта плохая ошибка аргумента была из-за другой ошибки. Он также работает для .load(.xml, ). Что, если я продолжу использовать .load вместо .read, как вы предложили? Как это повлияет? - person Sujit; 20.01.2016