如何实现一个cv::Mat对象的循环缓冲区(OpenCV)?

5
我正在尝试为我的程序实现循环缓冲区。该缓冲区用于在线程之间共享数据,如下所示。我使用OpenCV从相机(线程1)获取视频帧。然后,我想将此数据存储在循环缓冲区中,以便线程2可以从缓冲区获取数据。
如何在C ++中为 cv :: Mat 对象实现循环缓冲区?我知道如何为标准C ++对象(如 int 或 char )创建循环缓冲区,但无法让它与类型为 cv :: Mat 的对象一起工作。
有什么建议吗?

2
你在处理问题的cv::Mat部分遇到了什么困难?这种数据类型如何改变编写循环缓冲区的任务? - Rob Kennedy
@RobKennedy 我附上了我遇到问题的代码。我以http://en.wikipedia.org/wiki/Circular_buffer 为例,并将其修改为存储cv::Mat类型的数据(而不是类型'int')。但现在代码抛出了运行时错误。谢谢。 - Alexey
1
循环缓冲区代码本身对我来说运行良好(MSVC 2010 Ultimate SP1),这意味着你的崩溃是由某些与OpenCV相关的东西引起的,你最好使用调试器找到问题。 - Necrolis
@MarkRansom 是的,这就是导致崩溃的实际代码,而且该代码尚未使用线程(我只想先让代码在没有线程的情况下正常工作)。谢谢。 - Alexey
感谢@Necrolis。你可能是对的,循环缓冲区代码对于整数数据类型也对我有效。我检查了一下,确保'elem.value'包含正确的数据。我认为这可能与OpenCV在cv :: Mat中存储帧的方式有关。 - Alexey
显示剩余2条评论
3个回答

5

3

仅使用向量和下一个要写入的插槽以及下一个要处理的索引有什么问题吗?

您只需在到达末尾时处理环绕,并且如果使用2的幂作为向量大小,则可以使用简单的掩码进行处理。


谢谢。我明天会研究一下这个。 - Alexey
1
@Alex,使用向量肯定会简化代码,但我认为它不会修复你的错误。在尝试使用之前,请确保将向量的大小调整为循环缓冲区的容量。 - Mark Ransom

1
当只有写线程更新“end”指针,只有读线程更新“start”指针,并且对这些指针的访问是原子性的时,循环缓冲区是线程安全的。在“cbWrite”中有一个更新“start”的位置,这将导致竞争条件。

样例代码(导致崩溃)还没有线程。谢谢建议,实现线程将是我的下一步。 - Alexey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接