Как я могу писать в формате 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&_lock
Да, мой рабочий каталог, который я упомянул, также является каталогом, в котором я запускаю свой терминал, где также находится исполняемый файл. Я также пробовал с ручным поиском, файл не существует. Теперь я действительно запутался, так как не сталкиваюсь ни с какой ошибкой. Даже от отладки нет никакого отчета о сбое или чего-то еще.
Richard MacCutchan
Положи еще немного cout
операторы в вашей программе, чтобы вы действительно могли видеть, что происходит, когда она запускается.
lock&_lock
Ага, готово. Они были распечатаны правильно, но не был сгенерирован файл .yml.
Richard MacCutchan
Извините, у меня нет OpenCV, поэтому я не могу попробовать тест для вас. Вы могли бы посмотреть, есть ли где-нибудь специализированный форум, который может помочь.
lock&_lock
Нет, конечно. Конечно, никаких проблем. Я тоже уже спрашивал на форуме OpenCV. Спасибо.
Richard MacCutchan
Вчера я просмотрел пример кода на другом веб-сайте, и он выглядел точно так же, как и ваш, с точки зрения написания файла. Боюсь, это полная тайна.
Richard MacCutchan
Ну, что-то вроде сюрприза сегодня ...
Я потратил пару часов на установку OpenCV в моей системе Ubuntu и построил вашу программу - используя точный источник, опубликованный выше. Использование имен файлов с помощью .расширения yml и .xml он работает как закодированный. Файлы создаются и содержат записанные данные. Итак, теперь нам нужно выяснить, чем отличается ваша система.
lock&_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&_lock
Я не знаю, как проверить мою систему, почему она не будет работать на этом. Как я уже упоминал, этот код взят из книжного учебника, предыдущие примеры работали просто отлично до этого момента. Я хочу перейти к следующей главе, но это не дает мне покоя. Теперь я, по крайней мере, знаю, что проблема была не в моем коде.
Richard MacCutchan
Да, именно это и странно, так как я взял ваш код и ничего не изменил. Вы уверены, что CMAKE создает исполняемый файл правильно?
lock&_lock
Я думаю, что да, я написал свой файл CMake так же, как обычно, и они всегда работают до этого момента. Кроме того, в моем обновлении № 3 я попытался распечатать некоторые значения, просто используя " cout`. Когда я запускаю свою программу, они появляются просто отлично с их правильным значением, так что я думаю, что исполняемый файл в порядке.
Richard MacCutchan
Конечно, я забыл об этом. Что ж, мне очень жаль, но я не могу придумать ничего другого, что могло бы вам помочь.
lock&_lock
Итак, я закрываю этот вопрос ? Поскольку, вероятно, это не проблема кодирования (код в порядке?)
Richard MacCutchan
Тебе не нужно его закрывать. Кто знает, может, кто-то еще придет и найдет ответ.
lock&_lock
Спасибо.
Richard MacCutchan
Добро пожаловать; к сожалению, я не смог найти ответа.