lock&_lock Ответов: 1

Как я могу писать в формате YML и читать его с помощью opencv и C++ ?


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

#include <iostream>
#include <string>
#include "opencv2/core.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;

}


Что я уже пробовал:

В программе вообще нет ошибок, но нет вывода (нет вывода результата матрицы), когда я запускаю программу. Поэтому я не знаю, куда идти дальше.

1. По данным В формате OpenCV документации, добавив, Файл "Открыть" необходимо, чтобы я изменил в этом :
int main (int, char** argv){

        //create writer
        FileStorage fs, fs2;
        fs("test.yml", FileStorage::WRITE);

        //...

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


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

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

 //create reader
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, сгенерированного в моем рабочем каталоге. Если эта информация актуальна, я компилирую ее с помощью CMake. Чего мне здесь не хватало ?

ОБНОВЛЕНИЕ

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. Наконец, я подумал, что, возможно, в моем коде есть некоторые ошибки, поэтому я попытался запустить пример кода из OpenCV Docs : XML/YAML Persistence и я столкнулся с тем же самым. Я могу запустить программу, нет никакой ошибки, но не генерируется файл *.yml. Чего мне здесь не хватало ?

Richard MacCutchan

Файл будет храниться в том же каталоге, из которого выполняется исполняемая программа, или в том же каталоге, в котором установлен ваш терминал при ее запуске. Вы можете найти его, выполнив поиск из $HOME с помощью команды find.

lock&amp;_lock

Да, мой рабочий каталог, который я упомянул, также является каталогом, в котором я запускаю свой терминал, где также находится исполняемый файл. Я также пробовал с ручным поиском, файл не существует. Теперь я действительно запутался, так как не сталкиваюсь ни с какой ошибкой. Даже от отладки нет никакого отчета о сбое или чего-то еще.

Richard MacCutchan

Положи еще немного cout операторы в вашей программе, чтобы вы действительно могли видеть, что происходит, когда она запускается.

lock&amp;_lock

Ага, готово. Они были распечатаны правильно, но не был сгенерирован файл .yml.

Richard MacCutchan

Извините, у меня нет OpenCV, поэтому я не могу попробовать тест для вас. Вы могли бы посмотреть, есть ли где-нибудь специализированный форум, который может помочь.

lock&amp;_lock

Нет, конечно. Конечно, никаких проблем. Я тоже уже спрашивал на форуме OpenCV. Спасибо.

Richard MacCutchan

Вчера я просмотрел пример кода на другом веб-сайте, и он выглядел точно так же, как и ваш, с точки зрения написания файла. Боюсь, это полная тайна.

Richard MacCutchan

Ну, что-то вроде сюрприза сегодня ...

Я потратил пару часов на установку OpenCV в моей системе Ubuntu и построил вашу программу - используя точный источник, опубликованный выше. Использование имен файлов с помощью .расширения yml и .xml он работает как закодированный. Файлы создаются и содержат записанные данные. Итак, теперь нам нужно выяснить, чем отличается ваша система.

lock&amp;_lock

Вы действительно прошли весь путь до установки OpenCV, чтобы понять это, большое спасибо ! Вы также скомпилировали его с помощью CMAKE ? это проблема CMake ? Потому что я использую только терминал, а не IDE. Так что не может быть какой-то проблемы с компоновщиком IDE. Я использую Ubuntu 18.04, OpenCV 4.2 и CMake 3.2.

Richard MacCutchan

Я построил программу в окне терминала, используя g++, а не CMAKE, хотя результат должен быть таким же. Кроме того, моя система Ubuntu 16.04, и я установил OpenCV 3.4.9. однако я не уверен, почему это будет иметь такое значение.

lock&amp;_lock

Я не знаю, как проверить мою систему, почему она не будет работать на этом. Как я уже упоминал, этот код взят из книжного учебника, предыдущие примеры работали просто отлично до этого момента. Я хочу перейти к следующей главе, но это не дает мне покоя. Теперь я, по крайней мере, знаю, что проблема была не в моем коде.

Richard MacCutchan

Да, именно это и странно, так как я взял ваш код и ничего не изменил. Вы уверены, что CMAKE создает исполняемый файл правильно?

lock&amp;_lock

Я думаю, что да, я написал свой файл CMake так же, как обычно, и они всегда работают до этого момента. Кроме того, в моем обновлении № 3 я попытался распечатать некоторые значения, просто используя " cout`. Когда я запускаю свою программу, они появляются просто отлично с их правильным значением, так что я думаю, что исполняемый файл в порядке.

Richard MacCutchan

Конечно, я забыл об этом. Что ж, мне очень жаль, но я не могу придумать ничего другого, что могло бы вам помочь.

lock&amp;_lock

Итак, я закрываю этот вопрос ? Поскольку, вероятно, это не проблема кодирования (код в порядке?)

Richard MacCutchan

Тебе не нужно его закрывать. Кто знает, может, кто-то еще придет и найдет ответ.

lock&amp;_lock

Спасибо.

Richard MacCutchan

Добро пожаловать; к сожалению, я не смог найти ответа.

1 Ответов

Рейтинг:
2

phil.o

Пришло время отладить ваш код.

Вы должны поместить точку останова в первую строку основного метода и начать сеанс отладки. Это позволит вам выполнять код построчно, наблюдая за значениями в ваших переменных по пути. Это позволяет вам определить, где/когда вещи начинают отличаться от ожиданий, давая возможность исследовать, почему.

Найдите учебник по отладке с вашей текущей IDE, если вы не знакомы с концепцией отладки. Вы должны попробовать, это весело. И чрезвычайно полезен и ценен. Отладка является важным навыком для разработчика.


lock&amp;_lock

Да, я не знаком с отладкой и должен буду искать учебник по ней, и на самом деле я работаю на терминале, а не на IDE. Я буду обновлять свой прогресс, спасибо.

lock&amp;_lock

Обновление : это чрезвычайно трудно.

phil.o

Может быть, вам стоит использовать IDE с надлежащей отладочной функциональностью?

lock&amp;_lock

Спасибо, но, честно говоря, я не думаю, что установка IDE только для отладки-это ответ здесь, потому что у меня уже есть инструмент отладки.
Ранее я просто установил "gdb" для отладки терминала и прочитал несколько учебных пособий по нему. Я тоже попробовал несколько точек останова (перед записью файла и перед чтением файла), и там не было никакого сбоя, ошибки или чего-то еще. Действительно, с gdb это непросто, не говоря уже о том, что я только что научился им пользоваться, как 3 часа назад. Я согласен, что это важный навык, и я планирую узнать больше о gdb.
Но если мне все еще нужно установить целую IDE, выполнить настройку и научиться отлаживать с ее помощью только для целей отладки (поскольку я знаю, что не буду использовать IDE для написания кода), я не думаю, что это того стоит. Я застрял и очень запутался, это должен быть простой код, просто для чтения и записи файла.
Нет, я не сдамся, сейчас я просто сделаю перерыв и вернусь к этому позже. Еще раз большое спасибо за ваш ответ и советы по отладке. Я обновлю свой пост, когда у меня будет прогресс.