LabView перезаписывает захваченные изображения в очереди - PullRequest
1 голос
/ 03 апреля 2012

Я использую процедуры видения для захвата кадров («захват») с камеры GigE 300 кадров в секунду. Камера может выдавать кадры немного быстрее, чем HD может их записать, поэтому я записываю их в один цикл и помещаю их в очередь, которая считывается во втором (смежном / параллельном) цикле. Все идет хорошо, пока не закончится первый цикл (насколько я могу судить), что означает, что все данные были получены, большая часть была записана, а остальная часть просто должна быть записана. К сожалению, все изображения, оставленные в очереди волшебным образом задним числом , все заканчиваются одними и теми же данными, поэтому последняя часть набора данных содержит сотни статических кадров.

Как мне избежать этого поведения? Я предполагаю, что есть некоторый ресурс, который мне нужно удержать, чтобы буферная память изображений не использовалась, но это, очевидно, , а не сами изображения. (Я не делаю там никаких явных действий по очистке камеры.)

Вот описание того, что я делаю, в стиле 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, что является худшим из всех, что я видел. (И снова, записывает все изображения, в конце они все одинаковые.)

1 Ответ

1 голос
/ 03 апреля 2012

В цикле производитель-потребитель производитель должен скопировать изображение, чтобы оно не перезаписывалось на следующей итерации, если потребитель не обработал его. GrabImg не выполняет этот шаг, поэтому вам необходимо создавать новый перед каждым захватом, и потребителю позаботиться об освобождении каждого обработанного им буфера.

Остерегайтесь проблем с памятью, хотя!

...