【问题标题】:Linux Message Queue for OpenCV C++OpenCV C++ 的 Linux 消息队列
【发布时间】:2018-01-20 13:46:03
【问题描述】:

我有一个获取新帧的线程、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?

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

【问题讨论】:

    标签: linux opencv message-queue


    【解决方案1】:

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

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

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

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

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

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


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

    【讨论】:

      猜你喜欢
      • 2019-03-17
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 2018-09-09
      • 2013-04-16
      • 1970-01-01
      • 2011-04-27
      • 2012-03-22
      相关资源
      最近更新 更多