| Developers' Corner

采集模式回顾

在本月的技术文章中,我们想简单回顾一下 HALCON 中的图像采集模式,并澄清一些常见误解。

为简单起见,本文会使用 GenICam 术语,此术语适用于 GenICam 兼容设备,例如 USB3 Vision 和 GigE Vision 相机。表 1 是一些重要参数的汇总。如需全面了解所有 GenICam(包括所有 GenTL)参数,请参考 [1] 和 [2]。

ParameterValuesDefault
AcquisitionMode[Continuous, SingleFrame, MultiFrame]Continuous
TriggerSelector[FrameStart, ...] 
TriggerMode[On, Off] 
TriggerSource[Software, Line1, ...] 
[Stream]StreamBufferHandlingMode[OldestFirst, OldestFirstOverwrite, NewestOnly]OldestFirst

表 1

采集模式主要控制采集中捕获的帧数。大多数相机的默认模式是“连续”。在此模式下,只要执行 HALCON 算子 grab_image_start,相机就会开始一张接一张地捕获图像(图 1)。图像会在缓冲区排队,然后可以使用 grab_image_async 抓取。此方法可确保尽可能快地采集图像。[Stream]StreamBufferHandlingMode 可控制使用 grab_image_async 抓取缓冲区队列中的哪些图像。“抓取”表示用户会获取图像作为 HALCON 图形对象。

另一个常见用例是触发采集。这也应该使用 grab_image_async 来实现。当相机处于“连续”模式且 TriggerMode 设置为“开”时,调用 grab_image_start 后,相机即可开始采集图像。接收到触发信号后,相机会采集图像并将其推送到缓冲区队列(图 2)。然后同样可以使用 grab_image_async 从队列中抓取图像。通过参数 TriggerSource,可以选择软件或硬件触发。软件触发模式基本上等同于同步抓取。以下代码片段演示了如何设置软件触发采集:

open_framegrabber (...)
set_framegrabber_param (AcqHandle, 'TriggerSelector', 'FrameStart')
set_framegrabber_param (AcqHandle, 'TriggerMode', 'On')
set_framegrabber_param (AcqHandle, 'TriggerSource', 'Software')
grab_image_start (AcqHandle, -1)
for Index := 1 to 2105 by 1
    set_framegrabber_param (AcqHandle, 'TriggerSoftware', 1)
    grab_image_async (Image, AcqHandle, -1)
endfor

对于硬件触发采集,用户只需将 TriggerSource 更改为承载触发信号的线路即可。

同步抓取也可以使用算子 grab_image。它会通知相机获取单个图像,并将此图像作为 HALCON 对象返回。由于多种原因,此算子比 grab_image_async 慢得多,因此不应在要求速度或时间时使用(例如触发采集)。但是,如果要对 HDevelop 脚本进行简单原型设计,或是需要由人工交互(如点击按钮)触发图像采集,grab_image 会非常有用。

如需进一步了解 HALCON 图像采集,请查看我们的接口文档 [3],以及我们的标准示例,其中涵盖了大量用例。

[1] https://www.emva.org/wp-content/uploads/GenICam_SFNC_v2_6.pdf

[2] https://www.emva.org/wp-content/uploads/GenICam_GenTL_SFNC_1_2.pdf

[3] https://www.mvtec.com/products/interfaces