Как мне записать в формат YML и снова прочитать его с помощью OpenCV и C ++? - PullRequest
0 голосов
/ 28 февраля 2020

Я следую учебному пособию по OpenCV, чтобы писать и читать в хранилище файлов. Предполагается создать файл с именем " test.yml ", затем сохранить в нем некоторое значение и снова прочитать этот файл. Вот код из книги:

#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;

int main (int, char** argv){
        //create writer
        FileStorage fs("test.yml", FileStorage::WRITE);

        //save an int
        int fps = 5;
        fs << "FPS" << fps;

        //create some Mat sample
        Mat m1 = Mat::eye(2,3, CV_32F);
        Mat m2 = Mat::ones(3,2, CV_32F);
        Mat result = (m1+1).mul(m1+3);

        //write result
        fs << "Result" << result;

        //release file
        fs.release();

        //create reader
        FileStorage fs2("test.yml", FileStorage::READ);

        Mat r;
        fs2["Result"] >> r;
        cout << r << endl;
        fs2.release();
        return 0;

}

Нет ошибки при запуске программы, но нет выходных (пустых) файлов и файла * .yml, сгенерированного в моем активном / проекте рабочего каталога. Если эта информация актуальна, я компилирую с использованием CMake в терминале Ubuntu.

ЧТО Я ПРОБОВАЛ:

  1. Согласно OpenCV docs , добавление «open» необходимо при чтении, поэтому Я изменил код чтения следующим образом:

    int main (int, char** argv){
    
        //create writer
        FileStorage fs("test.yml", FileStorage::WRITE);
    
        //...
    
        //create reader
        FileStorage fs2.open("test.yml", FileStorage::READ);
    

    Но все еще пустой результат.

  2. Затем я попытался проверить, есть ли в нем какие-либо данные. Я добавил проверочный код:

    //create reader
    FileStorage fs2.open("test.yml", FileStorage::READ);
    
    Mat r;
    fs2["Result"] >> r;
    
    if (!r.data)
    {
            //Fails
            cout << "Could not open file. " << endl;
            return -1;
    }
    cout << r << endl;
    fs2.release();
    return 0;
    

    Возвращено " Не удалось открыть файл ". Оказывается, в моем активном / проектном рабочем каталоге нет файла * .yml.

  3. Я добавил cout, чтобы проверить, что мои матрицы имеют правильное значение и действительно ли они там.

     cout << "FPS " << fps << endl;
    
     cout << "Matrix One :" <<"\n" << m1 << endl;
     cout << "Matrix Two :" <<"\n" << m2 << endl;
     cout << "Result :" <<"\n" << result << endl;
    

    Матрицы были распечатаны правильно. Но файл. * Yml не будет сгенерирован.

  4. Я буквально пытался запустить XML пример кода из Документы OpenCV: постоянство XML / YAML , и я столкнулся с то же самое. Я могу запустить программу, ошибки нет, но файл * .yml не создан. Мне также посоветовали отладку, чтобы исследовать мой код, до сих пор отладка GDB была непростой, и я все еще работаю над ней.

Что мне здесь не хватало?

...