Halcon中用于RealSense设备的图像采集接口


)

前言

在新版本的halcon中内置了realsense的接口,本文对doc/html/reference/acquisition/hAcqRealSense.html文档中的内容做一定的整理 翻译 机翻 部分机翻。
跳过安装SDK、配置Halcon接口的步骤。

1.接口特性

  • 自动生成ObjectModel3D
  • 自动处理ObjectModel3D的颜色叠加问题
  • 无效的点会自动从生成的ObjectModel3D中排除
  • 同步和异步抓取

2.识别并打开设备

open_framegrabber:该算子用于连接realsense设备,其中的参数可以对获取到的图像的特性进行配置,当然,在持续采样过程中,也可以通过set_framegrabber_param算子对这些参数进行修改,一般情况可以使用默认参数。
与通过RealSense接口访问的设备的连接是通过设备ID建立的,该ID在每个设备上保证是唯一的,并且在多个会话中保持不变。系统中所有设备的列表可以通过info_framegrabber算子的参数'device''info_boards'获得,这两个参数返回的列表格式为:' | device:<device id> | unique_name:<unique name> | ... '。上面的字符串参数不仅可以标识不同的设备,而且可以直接用于open_framegrabber中的'Device'参数中(这时只需要'| device:<device id>'字符串条目)。
作为一种特殊情况,可以使用字符串 "default"–在这种情况下,HALCON采集接口将使用第一个可用设备(不可访问的设备将被跳过)。然而,当多个设备连接到系统时,这可能导致设备的非确定性打开。

RealSense设备通常由多个模块组成,每个模块提供一种类型的数据流。例如,深度模块提供深度数据,颜色模块提供颜色数据,可以叠加生成彩色点云。每个模块也可能由多个子组件组成(例如,D400设备的深度模块由两个红外传感器和一个红外激光投影仪组成)。
配置选项是在每个模块的基础上管理的。这意味着有些选项可能只对其中一个模块有效,有些选项可能对两个模块都有效。例如,"ExposureTime(曝光时间) "功能可以为深度和颜色模块配置,"LaserPower(激光功率) "功能只能为深度模块配置。为了涵盖这种使用情况,同时保持 "曝光时间 "等功能的单一性,SFNC(GenICam标准功能命名公约)指定了 “SourceSelector”。它允许切换配置选项的目标。
下面的例子说明了这个概念,它为每个模块配置了不同的 “曝光时间”:

set_framegrabber_param (AcqHandle,'SourceSelector','Depth')
set_framegrabber_param (AcqHandle,'ExposureTime',10000)
set_framegrabber_param (AcqHandle,'SourceSelector','Color')
set_framegrabber_param (AcqHandle,'ExposureTime',15000)

诸如ExposureTime这些特性的名称参考于librealsense2/h/rs_option.h文件,除非SFNC规定了一个特定的不同名称。

3.采集

3.1设备控制

图像采集可以是同步的(grab_image/grab_data),也可以是异步的(grab_image_start/grab_image_async/grab_data_async),见操作符的参考文件。
该接口可完全配置和控制摄像机的采集过程。请注意,在采集过程中,GenICam可能会锁定相机的某些功能。
在同步抓取(grab_image/grab_data)的情况下,每张图像都会在内部(internally)开始新的采集,因此应用程序总是能得到一张新的图像。在提供图像之前,采集会再次停止,因此在各个grab_image/grab_data调用之间,所有与采集有关的功能都保持解锁状态。
在异步抓取中,通过 grab_image_start 显式启动或通过 grab_image_async/grab_data_async 隐式启动,接口在内部保持抓取运行,收集更多的图像,通过未来的 grab_image_async/grab_data_async 调用传递。采集的相关功能被锁定,直到使用set_framegrabber_param(..., 'do_abort_grab', ...)停止采集。

3.2 抓取操作符

采集接口提供了两种从设备获取图像(或其他)数据的机制,即 grab_image/grab_image_asyncgrab_data/grab_data_async。在内部,这两种机制的工作方式完全相同(特别是它们如何从设备上获取和处理数据),它们的区别在于如何向应用程序提供输出。
grab_image/grab_image_async操作符只能输出一张图像。对于RealSense设备,这个单一的图像将包含3D点的Z坐标。它将作为图像类型 "real "的图像返回,其中每个像素是一个浮点值。这种方法目前也被HDevelop的图像采集助手所使用。
对于RealSense设备来说,grab_image/grab_image_async操作符太有限了,无法处理所有的数据。相反,应该使用 grab_data/grab_data_async 操作符。操作符的第一个输出变量中返回的图像元组总是包含三维点的X、Y和Z平面。所有这些都是 "real "图像类型的图像。此外,如果激活了,并且设备提供了必要的视频流,图像元组将包含颜色叠加和置信度图。要打开和关闭这些额外的组件,请参考SFNC的功能 "ComponentSelector "和 “ComponentEnable”。操作符也可以在’Date’输出变量中返回一个自动生成的ObjectModel3D。

3.3 获取三维数据(ObjectModel3D)

默认情况下,grab_data运算符只输出各种可用的图像或图像平面。为了处理三维数据,三维坐标必须被组合成一个点云。在HALCON的术语中,这被称为ObjectModel3D。RealSense采集接口提供了自动生成这种ObjectModel3D的机制。要激活这个功能,请使用参数 “create_objectmodel3d”。无效的点将被自动从生成的ObjectModel3D中排除。此外,可以使用参数’coordinate_transform_mode’、‘confidence_mode’、'confidence_threshold’和’add_objectmodel3d_overlay_attrib’配置这个过程。
点云可以被手动生成:ObjectModel3D也可以通过从图像元组中提取X、Y和Z平面并使用HALCON操作符’xyz_to_object_model_3d’来手动生成。

3.4 配置数据流

open_framegrabber过程中,会自动选择深度数据流的最大可用分辨率。如果有的话,彩色数据流和置信度叠加会自动激活。

3.5 缓冲处理

接口默认为采集引擎分配了4个缓冲区(缓冲区的数量可以通过open_framegrabber的’Generic’参数改变)。
每当一个新的图像被成功获取并作为HALCON图像传递给应用程序时,接口就会将缓冲区锁定(不将其返回给采集引擎),直到应用程序调用一个新的抓取相关的操作符或者使用set_framegrabber_param(.., 'do_abort_grab', ...)中止采集。在这期间,查询这个 "最后获取的 "缓冲区的信息是完全安全的–例如通过get_framegrabber_param参数查询缓冲区属性,如’buffer_timestamp’, ‘buffer_is_incomplete’, ‘image_width’ 和 ‘image_height’。
当应用程序调用一个新的抓取相关的操作符时,接口会将缓冲区返回给采集引擎,与缓冲区相关的查询就不再有效了。
可能发生的情况是,摄像机暂时或不断地以高于应用程序处理数据的速度获取数据。在这种情况下,RealSense Producer的流媒体引擎会根据’[Stream]StreamBufferHandlingMode’参数来决定如何处理所获取的缓冲区。

4.GenICam GenApi

5.参数

5.1 参数的命名规则

一共分三种命名规则,对应三种来源的参数:

  • HALCON GenTL的内部参数
    这些都是按照 "下划线 "的命名方式来命名的,例如,color_space,并且都是小写。
  • 基于GenICam的设备参数
    通常是相机的参数,采用驼峰法命名,例如ExposureTime
  • 各个RealSense Producer模块的基于genicam的参数(系统、接口、设备、数据流)
    与上面命名方法一致(驼峰法),但是要加前缀,前缀是用方括号框住的模块名:
"[System]", e.g., [System]TLVendorName.
"[Interface]", e.g., [Interface]InterfaceType.
"[Device]", e.g., [Device]DeviceID.
"[Stream]", e.g., [Stream]StreamBufferHandlingMode.

5.2 GenlCam 数据类型

Halcon提供的原生类型:

  • integer——带符号整数
  • real——浮点
  • string——字符串

在访问基于GenICam的特性时,必须将GenICam数据类型映射到HALCON识别的参数类型。GenICam提供以下类型:

  • IInteger
    整数值,直接映射到HALCON的integer类型。当GenICam特性被确定为IP或MAC地址时,还可以接受real参数
  • IFloat
    浮点值,直接映射到HALCON的实参数类型。它还将接受整数参数
  • IString
    字符串值,直接映射到HALCON的字符串参数类型
  • IBoolean
    通过HALCON的整型参数处理,值为0(0)表示逻辑错误,其他值表示逻辑真
  • IEnumeration
    枚举是一种类型,它允许从一组主要由其名称识别的值中进行选择(这些值被称为 “枚举条目”)。枚举是通过HALCON的字符串参数类型进行接口的,而枚举条目的名称被用作参数值。
  • ICommand
    该命令类型允许 "执行 "行动。要执行一个命令,请使用set_framegrabber_param,参数为任何数值的整数(该数值会被忽略)。有些命令的执行可能需要较长的时间,命令完成后会提供反馈。要查询状态,请对该命令使用get_framegrabber_param。如果它 “已经完成”(命令执行完毕),它将返回一个整数值1,如果它还没有完成,则返回0。请注意,如果其他一些功能被设计为依赖于该命令,那么查询 "已完成 "的状态可能是必要的,以便在命令执行结束后立即使依赖的功能失效(并以新值更新)。
  • IRegister
    寄存器数据类型用于不能被映射到任何其他数据类型的普通内存块。它们通过HALCON的字符串参数类型进行对接,寄存器的值是寄存器内存的十六进制字符串表示。

5.3 持续设备状态

采集设备设置的当前状态(定义其工作状态的所有参数的值)可能会在没有采集活动时持续存在,即在 grab_image_startgrab_image_async 之前或 set_framegrabber_param(.., 'do_abort_grab', 1) 之后。这不仅适用于实际的设备参数,也适用于配置RealSense Producer的参数和RealSense图像采集接口的内部参数。设备参数通常会保留到设备断电为止。RealSense Producer模块和Cusumer参数会一直保留到调用close_framegrabber。要指示哪些参数需要持久化,请使用参数’settings_selector’。持久性功能包括两个步骤,将当前的配置存储到一个文件中,之后再将其重新加载到设备上。由’settings_selector’指示的所选模块设置,可以使用’do_write_settings’参数存储,随后使用’do_load_settings’参数重新加载,在这两种情况下都要指定想要的持久化文件路径。要查询一个特征是否可以被持久化,可以使用后缀’_streamable’。
请注意,虽然文件的格式是有意让人阅读的,而且如果需要的话,可以手工修改文件,但这种修改应该由熟悉GenICam持久性功能内部和给定设备的人小心进行。对文件的不当修改会导致使用时出现错误。
相同的持久化文件可以应用于相同类型和固件版本的整套设备。将持久化文件应用于另一种类型的设备或使用不同的固件版本,可能会导致不一致或甚至完全失败。

6. 官方例程

比较简单,容易看懂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值