2

我在实现以下场景时遇到问题。我的问题陈述是这样的:

  1. 我有 3 个线程。ThreadCamera 用于从相机中抓取帧。ThreadProcess 用于处理(使用 OpenCV 在图像/帧抓取的图像上进行一些图像处理)帧和用于显示图像的主 GUI 线程。
  2. 我不知道 ThreadProcess 处理图像需要多少时间。所以我想将图像从 ThreadCamera 传递给 ThreadProcess ,对图像进行一些图像处理并将其传递给主 GUI 线程进行显示。
  3. 当 ThreadProcess 处理图像时,T​​hreadCamera 应该休眠。即它不应该从相机中抓取更多帧。当 ThreadProcess 完成图像处理任务时,它应该将图像和一些信息传递给主 GUI 线程。在此之后,只有 ThreadCamera 应该唤醒并从该(ThreadCamera)线程中运行的相机中获取下一帧/图像。

Thanx Guys...在将相机和图像处理工作放在一个线程中的一些评论之后,我想知道另一点..这是..

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