4.2.4 XLD物件
XLD是 eXtended Line Description 的缩写,这种数据结构用于纪录区域,例如任意尺 寸的区域或是多边型,开放或是封闭的等值线,直线等等。和 region 对象不同的,region 的 纪录精度是以像元为单位,而XLD对象以次像元精度来记录。XLD对象有两种基本结构, 等值线和多边型。
XLD 对象的建立方法是由线(等值线,边缘等等)上的取样点连接而成,藉由改变取样密度和 位置,可以提高精度,此外还包含了角度,弪度等等数据。一般来说,XLD 记录了边缘侦测 计算的结果,例如
edge_sub_pix,lines_gauss 等等。进一步的,可以用在次像元精度等级的计算及应用。详 细的信息请参考 Extension Package Programmer's Manual。
4.3 HALCON 的取像界面
目前 HALCON 提供了40余种取像接口,以 DLL 方式加载(dynamically loadable libraries, unix 下为 shared library),这些 library 是以HFG为档名开头,而为 parallel HALCON 设计 的 DLL 以 parHFG 为开头(请参考 5.3.2 节)。 HALCON 利用 Frame Grabber Interface,和取像设备商提供的驱动程序连结,由下列的运 算子构成了通用的沟通方法。
open_framegrabber
启动取像设备并设定参数。要设定的参数依设备的不同而异,例如相机形式或是连接的 port。
info_framegrabber
传回取像设备信息,例如默认值等等。
set_framegrabber_param 以及 get_framegrabber_param 设定或取得取像设备的参数。
grab_image grab_image_async
取像。两者的差异(同步及异步)请看下一节的说明。
grab_image_start 开始异步取像。
close_framegrabber close_all_framegrabbers 停止和取像设备的连结。同时会释放占用的系统资源。
46
set_feamegrabber_lut get_framegrabber_lut 设定或读取取像设备的 lookup table,这个功能只有一些特定的取像设备才支持。
如果您的取像设备安装好了,要和 HALCON 连接,只要叫用 open_framegrabber,给他取 像设备名称,例如相机形号等等参数,再来用 grab_image 就可以取得影像。 有件事要请使用者注意,就是 HALCON 的取像接口经常会更新,主要是因为 MVTec 持续的 在开发新的接口,另一方面,如果取像设备制造商更新了软件,HALCON 也会跟着更新。最 新的信息在 http://www.mvtec.com/halcon/framegrabber 可以找到,包括可下载的 DLL 以及 相关参数等等。
4.3.1 两种取像模式
HALCON 有两种取像方式,同步与异步取像。所谓同步取像,是由程序以 grab_image 通 知取像器取像,接着程序开始等待,一直到取像完成。也就是说,程序和取像器同步作业。 这种模式的好处是取得的影像是最新的,不过由于取像需要时间,像是 PAL 影像,需时40 ms 左右,造成的结果就是难以进行实时计算。如果取像还要再配合外部触发讯号(trigger), 耗费的等待时间就更多。 另一种模式,异步取像,则可支持实时运算。这种模式下取像分为两个阶段,第一,程序 以 grab_image_start 通知取像器开始进行取像,运算符会立刻响应,程序就可以继续未完成 的工作,例如处理上一张影像,而取像器可同时进行取像作业。再来要取得影像时,呼叫 grab_image_async。如果取像完成了,运算符会立刻传回新取得的影像,否则就会一直等到 取像完成。grab_image_async 还有一个功能,它可以限定影像的有效时间,若是间隔太久, 就会自动抓取一张新影像,以确保取得的影像是最新的。在传回影像前,grab_image_async 会自动开始抓取新影像,因此您不必再呼叫 grab_image_start 开始取像。 两种取像方式中,异步取像可以发挥最大的系统效能,由于计算(程序端)和取像(设备端) 是独立执行的,因此不会有互相等待而牵制的情况,但是对设计者而言,时间点的掌控因而 更形重要。
4.3.2 使用外部触发(External triggers)
除了上两种取像方式外,若是您的取像系统有此功能,就可以使用外部触发来直接命令相机 取像,这样可以整合其他的自动化设备,例如和一个光电传感器连结,当工件通过相机时就 照相。对 HALCON 来说,只要修改 frame_grabber 的参数即可搭配此类应用。 这种同步方式和上一节讲的同步取像有些基本上的不同。上一节叙述的方法中,图像处理的 计算和取像同步,也就是取完影像才开始计算,而使用 external trigger 时,是收到触发讯号 就开始取像,因此取像是依据某种条件进行的,而不是由程序下令。
47
大部分的 HALCON frame grabber interface 都可以设定一个逾时限制,可用
set_framegrabber_param 来设定,如果一个取像的动作逾时未完成,则会传回
H_ERR_FGTIMEOUT。 有件重要的事要注意,为了使外部讯号和取像时间一致,相机本身必须要能随时开始撷取新
影像,一般称之为 asynchronously resetable,也就是相机在收到讯号时,可以立刻中止 尚未完成的取像动作,然后进行新影像的撷取。如果没有这项功能,收到外部讯号到相机开 始取像之间会有时间差,而对于实时的计算应用而言,更糟糕的是这个延迟的时间不是定值, 可能趋近于0,也有可能接近撷取一张影像所花的时间。 综合上述,对于要求条件严格的实时取像应用,要使用外部触发讯号,同时就要选择有 asynchronously resetable 功能的相机。
4.3.3 Volatile 取像
在预设的情况下,grab_image 和 grab_image_async 是将取像系统取得的影像复制到 HALCON 影像对象所用的内存中,这种方式的好处是程序在计算时,新撷取的影像不至于 覆盖掉原先运算到一半的影像数据,此外,程序也可以对先前处理过的影像做一个 history。 由于影像的复制要花时间,像是 NTSC 影像要花2-3ms,在一些对实时性要求严苛的应 用上会出问题,因此某些 HALCON 的取像接口提供了所谓 volatile grabbing mode。这种模 式下,取像器会直接将影像数据写进 HALCON 影像对象内存中,因此少了复制的动作时 间。不过就另一方面来说,新读取进来的影像会盖掉旧的影像。 至于哪些 frame grabber interface 有支持,请查看相关手册。
4.3.4 使用 HALCON 未支持的取像设备
如果您使用的取像设备 HALCON 并未支持,一样也可以将它和 HALCON 整合在一起。这部 分请参考 Frame Grabber Intergration Programmer's Manual,以及其中的范例程序代码。 如果您已经使用 frame grabber 所提供的 API 来取像,要让 HALCON 处理您的程序所取得 的影像数据,只要将您程序中储存影像的 buffer 指针传给 HALCON,用 gen_image1_extern 即可。
48
4.4 HALCON 的使用极限
影像尺寸 32768*32768 内存中影像数组数目 100000 每个参数包含的对象数目 100000 每张影像的频道数 1000 tuple 中的数值数据数目 1000000 一条等值在线的取样点数目 30000 一个多边型上的控制点数目 10000 影像坐标 -32768 到 +32768 字符串长度 1024 个字符
49
第五章 使用 Parallel HALCON
本章介绍如何使用 parllel HALCON,以及其特性,平行处理机制,以及对于撰写平行运算程 式的支持。 如同标准版的 HALCON,要使用 parallel HALCON 有两种方式,一种是用它提供的 libraries 来撰写程序,另一种是使用'parallel'版本的 HDevelop,即所谓 parallel HDevelop。
parallel HALCON 以及 HDevelop
HDevelop 有两种版本,一种是标准版的,使用的核心是一般的 HALCON library,就是上一 章解说以及范例中执行的程序 hdevelop。另一种是依据 Parallel HALCON library 而产生 的,这个版本在多处理器的计算机上会自动做平行处理,对应的程序是 parhdevelop。
在独立的程序中使用 parallel HALOCN
如同标准版的 HALCON,要自行撰写支持平行运算功能的程序,就要 link 相对应的 library。 在 Windows/NT/2000/XP 下,需要 parhalconc.dll 或是 parhalconcpp.dll,在 UNIX 下,需要 的 library 是 libhalcon.so,依据程序语言的不同,还需要 libparhalconc.so 或是 libparhalconcpp.so,详细的数据请参考 HALCON/C 或是 HALCON/C++的 User's Manual。
5.1 Automatic parallelization
如果 Parallel HALCON 安装在具有多处理器的计算机上,它会自动将处理影像的运算符做平行 化的处理。
5.1.1 Parallel HALCON 的初始化 为了要使并行计算机制调整到符合您使用的计算机,Parallel HALCON 会做一次硬件的检 查,之后要使用平行运算时就不必再调整。检查的方法,是由 parallel HALCON 呼叫 check_par_hw_potential,要注意的是,从标准版的 HALCON 执行这个运算符的话就会出现 错误讯息。同样的,如果您在单处理器的计算机上执行这个运算符,也会出现错误讯息。这个 检查功能可以单独执行,执行档为 hcheck_parallel.exe,位于 %HALCONROOT%bin%ARCHITECTURE%下。
Parallel HALCON 藉由呼叫 check_par_hw_potenial 来检查每个运算符在做平行化以后的 效率提升程度。每个运算符都会做数次平行以及循序式的测试运算,同时会改变参数来测试 其效能。经由这个测试,程序会找出不同参数对计算的影响,例如说影像大小等等,以及资 料平行处理的效率提升程度。这个过程可能会花上10分钟(依计算机效能而异)。 由这个过程取得的信息,在 Windows NT/2000/XP 下,存放在 Registry 中,在 UNIX 下存于
50