我使用视觉程序从300fps GigE相机捕捉帧("抓取#34;)。相机可以比HD更快地传送帧,因此我可以在一个循环中捕获并将它们粘贴在队列中,该队列在第二个(相邻/并行)循环中读出。一切顺利,直到第一个循环结束(据我所知),这意味着数据全部已被获取,大部分已被写入,其余部分只需要写出来。不幸的是,队列中遗留下来的所有图像都是追溯,所有这些图像都以相同的数据结束,因此数据集的最后一部分包含数百个静态帧。
如何避免这种行为?我假设我需要保留某些资源,以便图像缓冲存储器不被回收,但显然不是图像本身。 (我没有在那里做任何明确的相机清理工作。)
这是对我正在做的事情的ASCII艺术描述(至少我希望这是相关部分):
+===============+ +==========+
-queue----@-------Insert--@---@-Empty?---@---Release queue
| # GrabImg-^ # # | #
| # # # Y->Stop #
| # i-(>n?)->Stop # +==========+
| +===============+
|
| +==============+
\--@-Deleted?--Y #
# | | #
# N->Get | #
# | v #
# Write Stop#
+==============+
我使用队列删除来表示循环结束。这有点草率,授予,所以我可以通过一个错误来理解,而不是2200的错误,这是我见过的最糟糕的错误。 (再次,它 写了所有的图像,它们最后都是一样的。)
答案 0 :(得分:1)
在生产者 - 消费者循环中,生产者需要复制图像,这样如果消费者没有处理它,它就不会在下一次迭代时被覆盖。 GrabImg不执行此步骤,因此您需要在每次抓取之前创建一个新的,并让消费者负责释放它已处理的每个缓冲区。
请注意内存问题!