1

Xcodeで記述したコマンドラインopenCVプログラムがあり、2つのXMLファイルを開き、分析して比較します。ただし、出力を理解しやすくするために、QtCreatorを使用してそのプログラムをGUIに配置しようとしています。

問題は、Qtがcv::FileStorageを好まないようだということです。プログラムは正常にコンパイルされますが、実際にOpenCV部分を実行しようとすると、クラッシュして次のエラーが発生します。

OpenCVエラー:cvOpenFileStorageのヌルポインター(NULLまたは空のバッファー)、ファイル/tmp/OpenCV-2.4.3/modules/core/src/persistence.cpp、行2702 Qtは、イベントハンドラーからスローされた例外をキャッチしました。イベントハンドラからの例外のスローは、Qtではサポートされていません。QApplication :: notify()を再実装し、そこですべての例外をキャッチする必要があります。

プログラムが予期せず終了しました。

Qtがこのプログラムを実行するのを好まないように見える理由を誰かが知っていますか?または、OpenCVプログラムをQtプログラムにきれいに統合できる方法がある場合はどうでしょうか。

注意:QtGUIは次のようになります。

ここに画像の説明を入力してください

ユーザーは、関連するボタンを使用して2つの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);
4

2 に答える 2

0

特にQtではありません。
OpenCV は fileStorage の使用でエラーをスローしています。ファイルが存在しないか、読み取れないか、または間違ったタイプを読み取ろうとしています。

より有用なエラーを出力するopenCvではなく、チェックされていない例外の一般的なエラーハンドラーに例外が到達したため、Qtはそのエラーを返します。

QApplication にメソッドを追加することで、Qt アプリにグローバル例外ハンドラーを追加できます。

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も参照してください。

于 2013-01-20T23:40:52.580 に答える