Конфликт производительности с использованием графического интерфейса для получения изображений и экспортированного кода HDevelop - PullRequest
0 голосов
/ 31 августа 2018

У меня есть настройка с камерой и системой вспышки, которая при использовании с графическим интерфейсом получения изображений в HDevelop дает мне надлежащую производительность. то есть захват изображения со вспышкой, сработавшей один раз. Я перехожу на вкладку «Генерация кода» и экспортирую код для того же, и при выполнении я получаю другую производительность. то есть изображение, снятое со вспышкой, сработавшей дважды. Я не смог точно определить проблему.

Ниже приведен код, экспортированный с использованием вышеупомянутой графической вкладки «Генерация кода»

open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'default', camID , 0, -1, AcqHandle)
set_framegrabber_param (AcqHandle, 'DeviceTemperatureSelector', 'Main')
set_framegrabber_param (AcqHandle, 'TriggerSelector', 'FrameStart')
set_framegrabber_param (AcqHandle, 'EventSelector', 'AcquisitionStart')
set_framegrabber_param (AcqHandle, 'bits_per_channel', -1)
* Image Acquisition 01: Attention: The initialization may fail in case parameters need to
set_framegrabber_param (AcqHandle, 'AcquisitionMode', 'SingleFrame')
grab_image_start (AcqHandle, -1)
grab_image_async (Image, AcqHandle, -1)
* Image Acquisition 01: Do something
close_framegrabber (AcqHandle)

1 Ответ

0 голосов
/ 01 сентября 2018

Чтобы понять, что происходит, вам нужно знать о двух разных способах получения изображений, которые есть у HALCON: синхронном и асинхронном. А также, как параметр AcquisitionMode влияет на получение на самой камере.

AcquisitionMode

Для камер GigE Vision значением по умолчанию для AcquisitionMode , обязательным для камеры, является «Непрерывный». Другими возможными значениями являются «SingleFrame» (который вы используете в размещенном вами коде) и «MultiFrame» (который я сейчас опущу).

Continuous

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

Singleframe

В этом режиме камера получает одно изображение, а затем приостанавливает получение до тех пор, пока не получит команду на получение следующего изображения.

Синхронный захват

Оператор grab_image используется для получения изображения. Когда этот оператор выполняется, выполняются следующие шаги:

  1. Если какие-либо изображения все еще находятся в каком-либо внутреннем буфере, они удаляются.
  2. Камере предписано начать съемку.
  3. После получения изображения камере предписывается прекратить получение.
  4. Изображение передается и возвращается оператором grab_image

Преимущество использования синхронного захвата состоит в том, что вы всегда получите изображение, полученное камерой после вызова оператора. Недостатком является то, что очистка буферов и запуск / остановка захвата на камере требуют времени, поэтому не всегда возможно достичь максимальной частоты кадров камеры в этом режиме. Другим недостатком является то, что при использовании внешнего триггера для вашей камеры может случиться, что вы теряете триггерные сигналы при синхронном захвате. Это может произойти, когда сигнал запуска активируется перед вызовом grab_image. В этот момент камера не получает, и сигнал запуска игнорируется.

Если вы используете Image Acquisition Assistant, это то, что происходит, когда вы нажимаете кнопку Snap. В вашей настройке это будет означать, что для одного grab_image вызова вы увидите вспышку один раз.

Асинхронный захват

Соответствующими операторами являются grab_image_start и grab_image_async. Существует также еще один параметр start_async_after_grab_async , который важен и по умолчанию имеет значение «enable».

Как и в опубликованном вами коде, вы обычно сначала звоните grab_image_start, который начинает съемку на камере, но не останавливает ее после получения первого изображения. Дальнейшие действия камеры зависят от настройки AcquisitionMode («Непрерывный»: продолжает получать данные, «SingleFrame»: ожидает сигнала для начала следующего захвата). Все изображения, полученные камерой, отправляются в HALCON и сохраняются в очереди буферов. При вызове grab_image_async получается самое старое изображение в очереди буфера. Если для start_async_after_grab_async установлено значение «включено», сразу после получения grab_image_async изображения отправляется команда на камеру для получения следующего изображения. В случае звонка grab_image_async до звонка grab_image_start, grab_image_async внутри страны звонит grab_image_start.

Преимущество асинхронного захвата состоит в том, что (по крайней мере, в «непрерывном» режиме) сбор данных всегда активен и, скорее всего, он теряет сигналы запуска. Недостатком является то, что вы можете получить более старое изображение из очереди буфера или что в какой-то момент очередь заполнится, когда изображения не будут получены достаточно быстро. Это, конечно, происходит, когда обработка изображения занимает больше времени, чем задержка между получением изображений.

Асинхронный захват - это то, что делает помощник по съемке изображений, когда вы нажимаете кнопку Live вместо кнопки Snap.

Сгенерированный код

Теперь мы можем посмотреть, что происходит в коде, который вы разместили. Вы используете grab_image_start, grab_image_async, AquisitionMode установлен на «SingleFrame» и start_async_after_grab_async установлен на «enable».

  1. grab_image_start вызывается, и на камере начинается сбор данных. Вспышка срабатывает один раз при получении изображения. Из-за режима «SingleFrame» камера приостанавливает съемку.
  2. grab_image_async вызывается и возвращается изображение, полученное при первом срабатывании вспышки. Поскольку получение не было остановлено, только приостановлено, на камере и поскольку start_async_after_grab_async включена, на камеру отправляется команда, чтобы начать следующее получение. Таким образом, вспышка срабатывает второй раз, когда получено следующее изображение, а затем камера снова ждет следующей команды.

Т.Л., др

Если вы хотите, чтобы камера получала только одно изображение, а затем остановилась, вам просто нужно заменить строки

grab_image_start (AcqHandle, -1)
grab_image_async (Image, AcqHandle, -1)

одной строкой

grab_image (Image, AcqHandle)
...