我有一个设置一个相机和一个闪光灯系统,当使用与图像采集图形界面在HDevelop内给我适当的性能。也就是说,用闪光灯触发一次图像捕获。我转到“代码生成”选项卡并导出相同的代码,并且在执行时获得另一个性能。即用闪光灯触发两次所捕获的图像。我一直无法确定这个问题。
下面是使用上述代码生成选项卡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)发布于 2018-09-01 07:14:57
要了解正在发生的事情,您需要了解HALCON有两种不同的获取图像的方法,一种是同步的,另一种是异步的。以及参数AcquisitionMode对摄像机本身采集的影响。
AcquisitionMode
对于GigE视觉摄像机,相机必须拥有的AcquisitionMode的默认值是“连续的”。其他可能的值是'SingleFrame‘(您在发布的代码中使用它)和'MultiFrame’(现在我将省略它)。
连续
在这种模式下,相机一直在获取图像,直到被告知停止拍摄为止。在获取一幅图像之后,或者直接开始获取下一帧,或者如果摄像机设置为特定的帧速率,则相机等待直到需要根据其设置获取下一幅图像。
SingleFrame
在这种模式下,照相机获取一个图像,然后暂停采集,直到被告知获取下一个图像为止。
同步抓取
操作符grab_image用于获取图像。在执行此操作符时,将执行以下步骤:
grab_image运算符传输和返回。使用同步抓取的好处是,在打电话给操作员之后,您将始终获得由摄像机获取的图像。缺点是,清空缓冲区和启动/停止相机上的采集需要时间,因此在这种模式下不总是能够达到摄像机的最大帧速率。另一个缺点是,当您使用外部触发器为您的相机,它可能会发生,您失去触发信号时,同步抓取。当触发信号在grab_image调用之前被激活时,就会发生这种情况。此时,相机不被获取,触发信号被忽略。
如果您使用的是图像获取助理,这是什么情况下,您按下按钮。在您的设置中,这意味着对于单个grab_image调用,您将只看到一次闪光灯。
异步抓取
相关算子是grab_image_start和grab_image_async。另外还有一个重要的参数start_async_after_grab_async,默认情况下它被设置为“已启用”。
在您发布的代码中,您通常首先调用grab_image_start,它在相机上启动采集,但在获取第一个图像后不会停止。摄像机下一步要做的事情取决于AcquisitionMode的设置(“连续”:它继续获取,“单帧”:它等待一个信号开始下一次采集)。相机获取的所有图像都被发送到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,所以会向摄像机发送命令以启动下一次获取。因此,当获取下一个图像时,闪光灯第二次触发,然后相机再次等待下一个命令。tl;博士
如果你想要相机只获取一张图像,然后停止,你只需要更换线条。
grab_image_start (AcqHandle, -1)
grab_image_async (Image, AcqHandle, -1)用单线
grab_image (Image, AcqHandle)https://stackoverflow.com/questions/52112762
复制相似问题