1

私は構造化された光で作業しており、私が書いたクラスがQCameraあります。QProjectorプロジェクタがパターンを投影すると、接続されているすべてのカメラがそのパターンをキャプチャするのを待ってから、次のパターンに進む必要があります。

私の現在のモデルはこれです:

  • QProjector画像を投影し、信号を発しますpatternProjected(Pattern*)
  • ConnectedQCameraは信号を受信し、プロジェクターのhold()信号に接続します (以下を参照)。その後、カメラは非同期で画像のキャプチャを開始し、完了すると出力frameCaptured(cv::Mat)します。

以前は にhold()スロットがありましたQProjector。プロジェクターを待機させたいカメラは、呼び出します。

connect(projector,SIGNAL(hold()),camera,SLOT(wait()))` 

camera->wait()ダミー関数です。次に、 で、プロジェクタは がゼロprojector->disconnectNotify()かどうかを確認します。receivers(SIGNAL(hold()))そうである場合、プロジェクタはキュー内の次のパターンに移動します。そうでない場合は、もう少し待ちます。

patternProjected()このアプローチは非常に混乱しており、機能しません。カメラからの接続の送信と受信の間で、プロジェクターが次のパターンに移行しないという保証はありません。

QObject哲学に沿って、理想的にはもう1つ、よりクリーンなアプローチを持っている人はいますか?

4

2 に答える 2

1

QProjectorwithでメンバ変数を初期化できreceivers(SIGNAL(hold()))、スロットが呼び出されるたびにデクリメントします。カウンターが に達する0と、 で再初期化しreceivers(SIGNAL(hold()))て別のパターンを投影します。

もちろん、このシナリオhold()ではひどい (非セマンティックな) 名前です。名前を変更する必要がありますpatternRead()

于 2013-02-20T19:14:41.423 に答える
0

次のようなメディエーション オブジェクトを提供できます。

//startWork increments some internal counter
connect(camera_1...n, SIGNAL(captureStarted()), mediator, SLOT(startWork()))

//stopWork decrements the counter, when counter reaches 0 emits trigger()
connect(camera_1...n, SIGNAL(captureFinished()), mediator, SLOT(stopWork()))

//startCapture emits captureStarted
connect(projector, SIGNAL(patternProjected()), camera_1...n, SLOT(startCapture())

//projectNext emits patternProjected
connect(mediator, SIGNAL(trigger()), projector, SLOT(projectNext()))
于 2013-02-20T19:33:13.097 に答える