2

次のシナリオを実装するのに問題があります。私の問題文は次のようになります。

  1. 私は3つのスレッドを持っています。カメラからフレームを取得するための ThreadCamera。フレームを処理するための ThreadProcess (取得した画像/フレームに対して OpenCV で画像処理を行う) と、画像を表示するためのメイン GUI スレッド。
  2. ThreadProcess が画像を処理するのにどれくらいの時間がかかるかわかりません。したがって、画像を ThreadCamera から ThreadProcess に渡し、画像に対して画像処理を行い、それをメインの GUI スレッドに渡して表示したいと考えています。
  3. ThreadProcess が画像を処理するとき、ThreadCamera はスリープする必要があります。つまり、カメラからさらにフレームを取得するべきではありません。ThreadProcess が画像処理タスクを終了すると、画像といくつかの情報をメインの GUI スレッドに渡す必要があります。この後、ThreadCamera のみが起動し、その (ThreadCamera) スレッドで実行されているカメラから次のフレーム/画像を取得する必要があります。

ありがとう...カメラと画像処理ジョブを単一のスレッドに入れるためのいくつかのコメントの後、私は別のポイントを知りたい..

  1. 処理中にカメラをスリープさせたくない場合はどうすればよいですか?CameraThread によって取得されたフレームの一部が失われても問題ありません (いずれにせよ、カメラをスリープ状態にするか、スリープ状態にしなくても失われます)。

各プロセス(カメラプロセスと画像処理ジョブ)にQObjectを使用し、特定のスレッドで実行するためにmovetoThreadコマンドを使用しています。

実装と信号/スロット設計に関する洞察は役に立ちます..

4

1 に答える 1

2

探しているのは、単純な「パブリッシュ/サブスクライブ」パターンです。このタイプの「配布」パターンでは、すべてのメッセージが送信され、画像を受信する状態でない場合、クライアントによってドロップされます。

これをアプリケーションで次のように実装します。

すでに行っているように、すべての個別のスレッド (カメラ、処理、Gui) を用意します。

CameraThread を定期的に (簡単にしたい場合は qTimer シグナルを介して) 画像をキャプチャし、シグナル/スロット接続を介して processingThread に送信します。

processingThread が画像を処理しているときは、現在画像を処理していることを示す状態フラグ (メンバー変数にすることができます。bool が機能します) を設定します。画像の処理が完了したら、処理していないことを示すフラグを設定します。

CameraThread から画像を受け取る processingThreads スロットで、まず現在画像を処理しているかどうかを確認します。もしそうなら、あなたは信号データで何もせず、ただ戻ってきます。画像を処理していない場合は、信号データを保存してプロセス関数を呼び出します。

これを機能させる秘訣は、この関数呼び出し( QCoreApplication::processEvents()) を処理関数の ProcessingThreads メイン ループに含めることです。これにより、ProcessingThread は、何か有用なことを行っている間に取得したシグナルを処理できます。

状態変数のチェックにより、現在の画像を処理している間に送信されたすべての新しい画像を「ドロップ」し、それらをキューに入れないようにすることができます。

于 2012-12-14T15:53:55.953 に答える