我在实现以下场景时遇到问题。我的问题陈述是这样的:
- 我有 3 个线程。 ThreadCamera 用于从相机中抓取帧。用于处理帧的 ThreadProcess(使用 OpenCV 对捕获的图像/帧进行一些图像处理)和用于显示图像的主 GUI 线程。
- 我不知道 ThreadProcess 处理图像需要多少时间。所以我想将图像从 ThreadCamera 传递到 ThreadProcess ,对图像进行一些图像处理并将其传递到主 GUI 线程进行显示。
- 当 ThreadProcess 处理图像时,ThreadCamera 应该休眠。 IE。它不应该从相机中抓取更多帧。当 ThreadProcess 完成图像处理任务时,它应该将图像和一些信息传递给主 GUI 线程。此后,只有 ThreadCamera 应该醒来并从该(ThreadCamera)线程中运行的相机中获取下一帧/图像。
感谢大家...在将相机和图像处理工作放在一个线程中的一些评论之后,我想知道另一点...这是...
- 如果在处理过程中不想让相机休眠怎么办?如果我丢失了 CameraThread 抓取的一些帧,对我来说并不重要(无论如何,如果我休眠或不休眠相机,我都会丢失)
我对每个进程(相机进程和图像处理作业)使用 QObject 并使用 movetoThread 命令使其在特定线程中运行。
任何有关实现和信号/槽设计的见解都会有所帮助。
您正在寻找的是一个简单的“发布/订阅”模式。在这种类型的“分发”模式中,当客户端不处于接收图像的状态时,所有消息都会被发送并由客户端丢弃
我将在您的应用程序中按如下方式实现:
像您已经做的那样,拥有所有单独的线程(相机、处理、Gui)。
让 CameraThread 定期(如果想简单的话可以通过 qTimer 信号)捕获图像并通过信号/槽连接将其发送到处理线程。
当处理线程正在处理图像时,它会设置一个状态标志(可以只是一个成员变量,bool 即可)来表示它当前正在处理图像。当你处理完图像后,你可以设置一个标志来表示你没有处理。
在处理线程槽中,它从 CameraThread 接收图像,您将首先检查当前是否正在处理图像。如果是,则无需对信号数据执行任何操作,只需返回即可。如果您不处理图像,您将存储信号数据并调用处理函数。
使这项工作有效的技巧是包括这个函数调用 (QCoreApplication::processEvents()
)在处理函数的ProcessingThreads主循环中。这将允许您的ProcessingThread在做一些有用的事情时处理它收到的任何信号。
状态变量检查将允许您在处理当前图像时“删除”发送给您的所有新图像,而不是将它们排队。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)