LabView会覆盖队列中捕获的图像

时间:2012-04-02 21:51:40

标签: image parallel-processing labview vision

我使用视觉程序从300fps GigE相机捕捉帧("抓取#34;)。相机可以比HD更快地传送帧,因此我可以在一个循环中捕获并将它们粘贴在队列中,该队列在第二个(相邻/并行)循环中读出。一切顺利,直到第一个循环结束(据我所知),这意味着数据全部已被获取,大部分已被写入,其余部分只需要写出来。不幸的是,队列中遗留下来的所有图像都是追溯,所有这些图像都以相同的数据结束,因此数据集的最后一部分包含数百个静态帧。

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

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

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

我使用队列删除来表示循环结束。这有点草率,授予,所以我可以通过一个错误来理解,而不是2200的错误,这是我见过的最糟糕的错误。 (再次,它 写了所有的图像,它们最后都是一样的。)

1 个答案:

答案 0 :(得分:1)

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

请注意内存问题!