gpt4 book ai didi

用于 OpenCV C++ 的 Linux 消息队列

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:32 25 4
gpt4 key购买 nike

我有一个获取新帧的线程,另外 2 个线程处理新获取的图像,还有 1 个线程根据处理线程打印输出。

程序循环进行,

>thread 3, print an output based on the previous outputs of the thread 0 and 1
>thread 0 get new image
>> thread 1, process image for color
>> thread 2, process image for haar cascade

循环 3&0>1&2>3&0>1&2>

'>' 表示在生成下一组之前加入

如何在线程 0 到 1&2 之间传递 opencv Mat?

另外,我如何将数据从线程 1 和 2 传递到线程 0?

我猜是一个消息队列系统,如何实现它?

最佳答案

我怀疑我可能会为此受到一些辱骂和反对票,因为全局变量通常不受欢迎,但是我觉得图像处理中的情况有所不同,其中:

  • 代码是多线程的,并且
  • 数据结构(图像)很大。

在这里,我认为重要的是要避免昂贵的复制和“传输” 数据向下套接字等,当它已经在线程之间共享和可见的内存中可用时。

因此,具体而言,我会选择一个数组或向量(根据您的喜好),例如 16 个 全局 可访问的 OpenCV Mats。

进入第一个线程,当缓冲区已满时通知下一个线程,然后进入下一个线程。等等。

关于通知,您有多种选择。最干净、最现代的可能是使用条件变量让每个处理线程(不是获取线程)在 condvar 上等待 “缓冲区已满”。接下来可能是 POSIX 消息队列,但如果您稍后要移植到 macOS,您可能会后悔,因为没有支持。另一种易于编程的方法是使用套接字,但只需发送一个字节作为 16 Mats 全局数组的索引——这样就不会有不完整的问题,套接字上的多字节读取。然后,处理线程只是坐在一个循环中,在套接字上进行阻塞读取,以了解要处理哪个缓冲区。您还可以定义一个特殊索引,表示“退出”


根据宽度 x 高度 x channel x 每个 channel 的字节数检查图像的大小,并了解 16 Mats 的全局向量需要多少内存,并确保在使用此策略之前有可用的内存 - 你例如,可能会与 Raspberry Pi 靠墙。

关于用于 OpenCV C++ 的 Linux 消息队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45645403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com