LabVIEW 正在覆盖队列中捕获的图像

问题描述 投票:0回答:1

我正在使用视觉例程从 300fps GigE 相机捕获帧(“抓取”)。 相机传输帧的速度比高清写入帧的速度稍快,因此我在一个循环中捕获并将它们粘贴到一个队列中,该队列在第二个(相邻/并行)循环中读出。 一切都很顺利,直到第一个循环完成(据我所知),这意味着数据已全部获取,大部分已写入,剩下的只需写出。 不幸的是,队列中留下的所有图像都神奇地追溯地最终都具有相同的数据,因此数据集的最后部分包含数百个静态帧。

如何避免这种行为? 我假设我需要保留一些一些资源,以便图像缓冲区内存不会被回收,但显然不是图像本身。 (我不会在那里做任何明确的相机清理工作。)

这是我正在做的事情的 ASCII 艺术描述(至少我希望这是相关部分):

          +===============+   +==========+
-queue----@-------Insert--@---@-Empty?---@---Release queue
       |  # GrabImg-^     #   #  |       #
       |  #               #   #  Y->Stop #
       |  # i-(>n?)->Stop #   +==========+
       |  +===============+
       |
       |  +==============+
       \--@-Deleted?--Y  #
          #  |        |  #
          #  N->Get   |  #
          #      |    v  #
          #    Write Stop#
          +==============+

我使用队列删除来表示循环结束。 当然,这有点草率,所以我可以理解 off by one 错误,但不能理解 off-by-2200 错误,这是我见过的最糟糕的错误。 (再说一次,它确实写下了所有图像,它们最后都是一样的。)

parallel-processing video-processing producer-consumer labview
1个回答
1
投票

在生产者-消费者循环中,生产者需要复制图像,以便在消费者尚未处理图像时,它不会在下一次迭代时被覆盖。 GrabImg 不会执行此步骤,因此您需要在每次抓取之前创建一个新的,并让使用者负责释放它已处理的每个缓冲区。

但要注意内存问题!

© www.soinside.com 2019 - 2024. All rights reserved.