Чтобы понять, что происходит, вам нужно знать о двух разных способах получения изображений, которые есть у HALCON: синхронном и асинхронном. А также, как параметр AcquisitionMode влияет на получение на самой камере.
AcquisitionMode
Для камер GigE Vision значением по умолчанию для AcquisitionMode , обязательным для камеры, является «Непрерывный». Другими возможными значениями являются «SingleFrame» (который вы используете в размещенном вами коде) и «MultiFrame» (который я сейчас опущу).
Continuous
В этом режиме камера непрерывно получает изображения, пока не получит указание прекратить это делать. После получения одного изображения либо непосредственно начинается получение следующего кадра, либо, если камера настроена на определенную частоту кадров, она ждет, пока ей не потребуется получить следующее изображение в соответствии с его настройками.
Singleframe
В этом режиме камера получает одно изображение, а затем приостанавливает получение до тех пор, пока не получит команду на получение следующего изображения.
Синхронный захват
Оператор grab_image
используется для получения изображения. Когда этот оператор выполняется, выполняются следующие шаги:
- Если какие-либо изображения все еще находятся в каком-либо внутреннем буфере, они удаляются.
- Камере предписано начать съемку.
- После получения изображения камере предписывается прекратить получение.
- Изображение передается и возвращается оператором
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».
grab_image_start
вызывается, и на камере начинается сбор данных. Вспышка срабатывает один раз при получении изображения. Из-за режима «SingleFrame» камера приостанавливает съемку.
grab_image_async
вызывается и возвращается изображение, полученное при первом срабатывании вспышки. Поскольку получение не было остановлено, только приостановлено, на камере и поскольку start_async_after_grab_async включена, на камеру отправляется команда, чтобы начать следующее получение. Таким образом, вспышка срабатывает второй раз, когда получено следующее изображение, а затем камера снова ждет следующей команды.
Т.Л., др
Если вы хотите, чтобы камера получала только одно изображение, а затем остановилась, вам просто нужно заменить строки
grab_image_start (AcqHandle, -1)
grab_image_async (Image, AcqHandle, -1)
одной строкой
grab_image (Image, AcqHandle)