我在实现以下场景时遇到问题。我的问题陈述如下:
- 我有3个线程。ThreadCamera从相机中抓取帧。ThreadProcess用于处理(使用OpenCV对抓取的图像/帧进行一些图像处理)帧和用于显示图像的主GUI线程
- 我不知道ThreadProcess处理一个图像需要多少时间。因此,我想将图像从ThreadCamera传递给ThreadProcess,对图像进行一些图像处理,并将其传递给主GUI线程进行显示
- ThreadProcess处理图像时,ThreadCamera应处于休眠状态。也就是说,它不应该从相机抓取更多的帧。当ThreadProcess完成图像处理任务时,它应该将图像和一些信息传递给主GUI线程。在这之后,只有ThreadCamera应该唤醒并从该(ThreadCamera)线程中运行的相机中获取下一帧/图像
谢谢各位。。。在评论了一些将相机和图像处理工作放在一个线程中之后,我想知道另一点。。是..
- 如果在处理过程中不想让相机休眠怎么办?如果我松开了CameraThread抓取的一些相框,对我来说并不重要(在任何情况下,如果我睡觉或不睡觉,我都会松开)
我为每个进程(相机进程和图像处理作业)使用QObject,并使用movetoThread命令使其在特定线程中运行。
任何关于实现和信号/插槽设计的见解都将有所帮助。。
您想要的是一个简单的"发布/订阅"模式。在这种类型的"分发"模式中,当客户端不处于接收图像的状态时,所有消息都会被发送并丢弃
我将在您的应用程序中实现如下:
拥有所有独立的线程(相机,处理,桂),就像你已经做了
让CameraThread周期性地(通过qTimer信号,如果你想让它变得简单的话)捕获一个图像,并通过信号/插槽连接将其发送到processingThread。
当processingThread处理图像时,它会设置一个状态标志(可以只是一个成员变量,bool也可以)来表示它当前正在处理图像。当你处理完图像后,你会设置标志表示你没有处理。
在从CameraThread接收图像的processingThreads插槽中,您将首先检查当前是否正在处理图像。如果是,则不处理信号数据,只返回。如果您不处理图像,您将存储信号数据并调用处理函数。
实现此功能的诀窍是将此函数调用(QCoreApplication::processEvents()
)包含在处理函数的ProcessingThreads主循环中。这将允许ProcessingThread在做有用的事情时处理它得到的任何信号。
状态变量检查将允许您在处理当前图像时"删除"发送给您的所有新图像,而不将它们排队。