1

我有一个带有相机和闪光灯系统的设置,当与 HDevelop 中的图像采集 GUI 一起使用时,它可以为我提供适当的性能。即,使用闪光灯触发一次的图像捕获。我转到代码生成选项卡并导出相同的代码,执行时我得到了另一个性能。即两次触发闪光灯拍摄的图像。我一直无法确定问题所在。

下面是使用上述代码生成选项卡 ​​GUI 导出的代码

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)
4

1 回答 1

2

要了解发生了什么,您需要了解 HALCON 拥有的两种不同的获取图像的方法,一种是同步的,一种是异步的。以及参数AcquisitionMode如何影响相机本身的采集。

采集模式

对于 GigE Vision 相机,相机必须具有的AcquisitionMode的默认值是“Continuous”。其他可能的值是“SingleFrame”(您在发布的代码中使用)和“MultiFrame”(我现在将省略)。

连续的

在这种模式下,相机会连续采集图像,直到被告知停止这样做。获取一张图像后,或者直接开始获取下一帧,或者如果相机设置为特定的帧速率,相机会等待直到需要根据其设置获取下一张图像。

单帧

在这种模式下,相机采集一张图像,然后暂停采集,直到被告知采集下一张图像。

同步抓取

算子grab_image用于获取图像。执行此运算符时,将执行以下步骤:

  1. 如果任何图像仍在任何内部缓冲区中,它们将被丢弃。
  2. 相机被告知开始采集。
  3. 获取图像后,相机会被告知停止获取。
  4. 图像由grab_image操作员传输和返回

使用同步抓取的好处是,在您调用操作员后,您将始终获得由相机获取的图像。不利的一面是,清空缓冲区和开始/停止相机上的采集需要时间,因此在此模式下并不总是能够达到相机的最大帧速率。另一个缺点是,当您为相机使用外部触发器时,同步抓取时可能会丢失触发信号。当触发信号在调用之前被激活时,就会发生这种情况grab_image。此时相机不采集,触发信号被忽略。

如果您使用的是图像采集助手,当您按下 Snap 按钮时会发生这种情况。在您的设置中,这意味着对于单个grab_image呼叫,您将看到一次闪光。

异步抓取

相关运算符为grab_image_startgrab_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_startgrab_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被调用并在相机上开始采集。获取图像时闪光灯会闪光一次。由于“单帧”模式,相机会暂停采集。
  2. grab_image_async调用并返回第一次闪光时获取的图像。因为在相机上采集没有停止,只是暂停,并且因为start_async_after_grab_async已启用,所以会向相机发送命令以开始下一次采集。因此,当获取下一张图像时,闪光灯会再次闪光,然后相机再次等待下一个命令。

tl;博士

如果您希望相机仅采集一张图像然后停止,您只需更换线条

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

用单行

grab_image (Image, AcqHandle)
于 2018-09-01T07:14:57.823 回答