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

Имам програма за команден ред openCV, която написах в Xcode, която отваря два XML файла, анализира и след това ги сравнява. Сега обаче се опитвам да поставя тази програма в GUI с помощта на 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?

N.B. Ето как изглежда Qt GUI:

въведете описание на изображението тук

Потребителят избира двата 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