cv::FileStorage не работает в Qt

У меня есть программа openCV командной строки, которую я написал в Xcode, которая открывает два файла XML, анализирует и затем сравнивает их. Однако сейчас я пытаюсь поместить эту программу в графический интерфейс, используя QtCreator, чтобы упростить понимание вывода.

Проблема в том, что Qt не нравится cv::FileStorage. Программа компилируется нормально, но когда я на самом деле пытаюсь выполнить часть OpenCV, она падает, выдавая эту ошибку:

Ошибка OpenCV: нулевой указатель (NULL или пустой буфер) в cvOpenFileStorage, файл /tmp/OpenCV-2.4.3/modules/core/src/persistence.cpp, строка 2702. Qt перехватил исключение, созданное обработчиком событий. Генерация исключений из обработчика событий не поддерживается в Qt. Вы должны переопределить QApplication::notify() и перехватить там все исключения.

Программа неожиданно завершилась.

Кто-нибудь знает, почему Qt не нравится запускать эту программу? Или есть способ, которым я могу чисто интегрировать программу OpenCV в программу Qt?

Н.Б. Вот как выглядит графический интерфейс Qt:

введите здесь описание изображения

Пользователь выбирает два файла XML с помощью соответствующих кнопок. Пути к этим файлам затем сохраняются и отображаются в полях рядом с кнопками. Затем я конвертирую QStrings в std::strings, используя следующее:

std::string file1path = file1Name.toUtf8().constData();
std::string file2path = file2Name.toUtf8().constData();

Затем file1path и file2path передаются командам cv::FileStorage следующим образом:

//Create File Storage
FileStorage storage1;
storage1.open(file1path, FileStorage::READ);

FileStorage storage2;
storage2.open(file2path, FileStorage::READ);

person JM92    schedule 20.01.2013    source источник
comment
OpenCV, так сказать, не используется в Qt. Qt - это просто еще одна библиотека. Вызовы функций, которые не включают метод или структуру данных Qt, не должны заботиться о том, что программа также использует Qt.   -  person Charles Burns    schedule 21.01.2013


Ответы (1)


Это не конкретно Qt.
OpenCV выдает ошибку при использовании вами fileStorage, либо файл не существует, либо не читается, либо вы пытаетесь прочитать неправильные типы.

Qt дает вам эту ошибку, потому что исключение достигло своего общего обработчика ошибок для непроверенного исключения, а не openCv, который напечатал бы более полезную ошибку.

Вы можете добавить глобальный обработчик исключений в приложение Qt, добавив метод в QApplication

bool QApplication::notify ( QObject * receiver, QEvent * event )
    {
      try{
        return QApplication::notify( received, event );
      }
      catch ( const std::exception &e )
      {
        QApplication::postEvent( this, new MyEvent( e.what() );
      }
      catch ( ... )
      {

      }

См. также http://qt-project.org/doc/qt-4.8/exceptionsafety.html

person Martin Beckett    schedule 20.01.2013