1

我正在使用结构光,我有我写QCameraQProjector课程。当投影仪投射一个图案时,它必须等待所有连接的相机捕捉到该图案,然后才能移动到下一个。

我现在的模型是这样的:

  • QProjector投影图像并发出信号patternProjected(Pattern*)
  • Connected QCameras 接收信号并连接到投影仪的hold()信号(见下文)。然后相机开始异步捕获图像并frameCaptured(cv::Mat)在完成后发射。

以前我hold()QProjector. 希望投影仪等待它的相机会调用

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

哪里camera->wait()是一个虚拟函数。然后,在 中projector->disconnectNotify(),投影仪检查是否receivers(SIGNAL(hold()))为零。如果是,则投影仪将移动到其队列中的下一个图案;如果没有,它会再等一些。

这种方法是一团糟,甚至行不通——不能保证投影仪在发射patternProjected()和接收来自相机的连接之间不会移动到下一个模式。

任何人都有一种更清洁的方法,最好是一种更符合QObject哲学的方法?

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 回答