2

多くの画像処理を行うQtGUIアプリケーションを作成するつもりです。QThread一部の計算は数秒の範囲である可能性があるため、表示がフリーズしないように、計算をに配置するつもりです。

Qtとopencv2.31を統合することができ、メイン(GUI)スレッドからいくつかのテストを正常に実行しました。画像の作成、描画、基本的なアルゴリズムの実行、およびでの表示cvNamedWindowです。すべて正常に動作します。

ただし、を開始しQThreadて以前のテストをそこに移動すると、奇妙なことが起こります。

  • 画像を割り当てたり、ファイルから開いたり、描画したり(例cvLine)、正常に機能します(GUIスレッドに送信して表示できます)
  • ほとんどの変換を実行すると、アプリケーションがクラッシュします(例cvSmooth
  • 表示機能(例cvNamedWindowcvShowImage)を使用しても機能しませんが、少なくともプログラムがクラッシュすることはなく、「QPixmap:GUIスレッドの外部でpixmapを使用するのは安全ではありません」をQtデバッグ出力に送信するだけです。(cvNamedWindowはQtに実装されており、QtはメインGUIスレッドからの表示のみを許可しているため、これは私が理解しているものです)

メイン以外のスレッドから画像処理機能を使用する方法はありますか?メインスレッドでエッジ検出などを行うのは直感に反しますが、セグメンテーションやその他のリソースを大量に消費するアルゴリズムははるかに少なくなります...

これは、メイン(GUI)スレッドでは機能するが、QThreadでは機能しない例です。これはCAPIのみを使用しています。これは、C++APIがQtでさらに多くの問題を引き起こしたためです。これは、Cソリューションでも十分であることを意味しますが、私はC++APIを使用する他のソリューションを受け入れています。

IplImage *test;
test = cvCreateImage( cvSize(640,480), 8, 1 );
cvLine(test,cvPoint(20,20),cvPoint(100,100),cvScalar(255,0,0),3);  // works fine even in thread
cvSmooth( test, test, CV_GAUSSIAN, 11, 11 );                       // crashes if in thread
cvNamedWindow("test");                                             // warning if in thread
cvShowImage("test",test);                                          // warning if in thread

4

1 に答える 1

2

可能ですが、OpenCV は異なるスレッドからの呼び出しをサポートするように構築されていません。そのため、コードでミューテックスを使用する必要があります。

あなたと同じように、私はこれを達成しようとして問題を経験しました。GUI を描画するコードを 2 番目のスレッドに移動し、メイン スレッドを OpenCV 呼び出し、フレーム グラビングなどのために予約しておきたい場合があります。

于 2012-09-17T16:40:20.710 に答える