首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用图像采集图形界面和导出的HDevelop代码进行性能冲突

使用图像采集图形界面和导出的HDevelop代码进行性能冲突
EN

Stack Overflow用户
提问于 2018-08-31 09:47:35
回答 1查看 583关注 0票数 1

我有一个设置一个相机和一个闪光灯系统,当使用与图像采集图形界面在HDevelop内给我适当的性能。也就是说,用闪光灯触发一次图像捕获。我转到“代码生成”选项卡并导出相同的代码,并且在执行时获得另一个性能。即用闪光灯触发两次所捕获的图像。我一直无法确定这个问题。

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

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-01 07:14:57

要了解正在发生的事情,您需要了解HALCON有两种不同的获取图像的方法,一种是同步的,另一种是异步的。以及参数AcquisitionMode对摄像机本身采集的影响。

AcquisitionMode

对于GigE视觉摄像机,相机必须拥有的AcquisitionMode的默认值是“连续的”。其他可能的值是'SingleFrame‘(您在发布的代码中使用它)和'MultiFrame’(现在我将省略它)。

连续

在这种模式下,相机一直在获取图像,直到被告知停止拍摄为止。在获取一幅图像之后,或者直接开始获取下一帧,或者如果摄像机设置为特定的帧速率,则相机等待直到需要根据其设置获取下一幅图像。

SingleFrame

在这种模式下,照相机获取一个图像,然后暂停采集,直到被告知获取下一个图像为止。

同步抓取

操作符grab_image用于获取图像。在执行此操作符时,将执行以下步骤:

  1. 如果任何图像仍在任何内部缓冲区中,则它们将被丢弃。
  2. 摄像机被告知开始拍摄。
  3. 在获取图像后,要求照相机停止采集。
  4. 图像由grab_image运算符传输和返回。

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

如果您使用的是图像获取助理,这是什么情况下,您按下按钮。在您的设置中,这意味着对于单个grab_image调用,您将只看到一次闪光灯。

异步抓取

相关算子是grab_image_startgrab_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_startgrab_image_async,AquisitionMode设置为'SingleFrame‘,start_async_after_grab_async设置为'enable’。

  1. grab_image_start被调用并在摄像机上开始获取。当获取图像时,闪光灯只触发一次。由于'SingleFrame‘模式,相机然后暂停获取。
  2. 将调用grab_image_async,并返回第一次触发闪存时获取的图像。因为获取没有停止,只能暂停,并且由于启用了start_async_after_grab_async,所以会向摄像机发送命令以启动下一次获取。因此,当获取下一个图像时,闪光灯第二次触发,然后相机再次等待下一个命令。

tl;博士

如果你想要相机只获取一张图像,然后停止,你只需要更换线条。

代码语言:javascript
复制
grab_image_start (AcqHandle, -1)
grab_image_async (Image, AcqHandle, -1)

用单线

代码语言:javascript
复制
grab_image (Image, AcqHandle)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52112762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档