要了解发生了什么,您需要了解 HALCON 拥有的两种不同的获取图像的方法,一种是同步的,一种是异步的。以及参数AcquisitionMode如何影响相机本身的采集。
采集模式
对于 GigE Vision 相机,相机必须具有的AcquisitionMode的默认值是“Continuous”。其他可能的值是“SingleFrame”(您在发布的代码中使用)和“MultiFrame”(我现在将省略)。
连续的
在这种模式下,相机会连续采集图像,直到被告知停止这样做。获取一张图像后,或者直接开始获取下一帧,或者如果相机设置为特定的帧速率,相机会等待直到需要根据其设置获取下一张图像。
单帧
在这种模式下,相机采集一张图像,然后暂停采集,直到被告知采集下一张图像。
同步抓取
算子grab_image
用于获取图像。执行此运算符时,将执行以下步骤:
- 如果任何图像仍在任何内部缓冲区中,它们将被丢弃。
- 相机被告知开始采集。
- 获取图像后,相机会被告知停止获取。
- 图像由
grab_image
操作员传输和返回
使用同步抓取的好处是,在您调用操作员后,您将始终获得由相机获取的图像。不利的一面是,清空缓冲区和开始/停止相机上的采集需要时间,因此在此模式下并不总是能够达到相机的最大帧速率。另一个缺点是,当您为相机使用外部触发器时,同步抓取时可能会丢失触发信号。当触发信号在调用之前被激活时,就会发生这种情况grab_image
。此时相机不采集,触发信号被忽略。
如果您使用的是图像采集助手,当您按下 Snap 按钮时会发生这种情况。在您的设置中,这意味着对于单个grab_image
呼叫,您将看到一次闪光。
异步抓取
相关运算符为grab_image_start
和grab_image_async
。还有一个参数start_async_after_grab_async很重要,默认设置为“启用”。
在您发布的代码中,您通常首先调用grab_image_start
它开始在相机上进行采集,但在获取第一张图像后不会停止它。相机下一步做什么取决于AcquisitionMode的设置('Continuous':它继续采集,'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
被调用并在相机上开始采集。获取图像时闪光灯会闪光一次。由于“单帧”模式,相机会暂停采集。
grab_image_async
调用并返回第一次闪光时获取的图像。因为在相机上采集没有停止,只是暂停,并且因为start_async_after_grab_async已启用,所以会向相机发送命令以开始下一次采集。因此,当获取下一张图像时,闪光灯会再次闪光,然后相机再次等待下一个命令。
tl;博士
如果您希望相机仅采集一张图像然后停止,您只需更换线条
grab_image_start (AcqHandle, -1)
grab_image_async (Image, AcqHandle, -1)
用单行
grab_image (Image, AcqHandle)