У меня есть программа 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);
Это не 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
Других решений пока нет …