配色: 字号:
HALCON手册简体中文版
2023-01-29 | 阅:  转:  |  分享 
  
第一章 HALCON





恭喜诸位。 您采用了这套在产品研发,研究以及教育方面都有顶尖表现的影像分析软件。

HALCON 可在 UNIX,NT/2000/xp 等等平台下作业,它独特的 Library 提供了千余个为影像 分析作业,数据可视化,除错等等功能所设计的运算符,用户可以利用它的功能以 C 及 C++等程序语言自行撰写图像处理程序。

此外,HALCON 亦支持 Windows NT/2000/XP 下的 COM 接口,所以您也可以透过 Visual

Basic 使用它,使得系统的整合更为容易。

HALCON 的设计使得影像区域,边缘,以及等值线的处理上更方便,优化的算法让这套 软件在一般的硬件上也有很好的指令周期。

HALCON 包含了名为 HDevelop 的程序设计界面,减少了设计软件所花的时间,还有一个好 用的联机帮助,您可以查到关于 HALCON 运算符间功能相近的替代者,可能的变化,以及 交互的参考。





HALCON 从 6.0 版开始提供两个版本,除了标准版外,还有支持平行运算的 parallel

HALCON,可使用多 CPU 的机器,提高指令周期。





以下是 HALCON 特点的说明



1.1



HALCON 强化的 opreator library 提供有效率又有弹性的图像处理功能,简化了影像程序 的设计





HALCON operator library 有千余个运算符。所有的 HALCON 应用程序(像是 HDevelop 和 HALCON C++程序)皆是利用这个 library 来工作。 这些运算符功能广泛,包含了简单的读取影像,到复杂的像是 Kalman 滤波等。基本上这些 运算符各有其单一功能,而非包含了各种运算,因此一个影像分析功能是由好几个运算符组 成的,所以其弹性远大于由少数而复杂的运算符组成的分析程序。特化而复杂的运算符往往 只适用于某些工作甚至于影像,应用范围狭窄。相对于这种窘境,HALCON 运算符却能任 意组合来完成工作。 众多的运算符中,有些是以不同的算法来达到相同的功能,例如只需要粗略定位时,可用 fast_match 来作最快的运算,需要精确定位时,用 best_match,以较多的时间来求得最准 确结果。

HALCON 可处理彩色及多频道影像 可用于计算的影像数据,包含二值化影像,单色,彩色,或是多频影像,在使用上并无差别。

(多频道影像是以多镜头系统取得的影像数据)。





HALCON 提供了快速有效率的 region 处理计算

除了使计算更容易外,region 尺寸无限制,甚至于可以重迭,而 region 数据经过最佳的编码 处理,在内存中所占的资源极少。





HALCON 可做 ROI 的计算

每个影像中的物体都可由用户自行定义其 region,接着再由运算符进行计算时就可以只针 对定义区域作处理,因此可以集中运算资源和速度,达到最好的效率。





HALCON 提供了快速的 pattern 匹配计算

pattern 匹配在许多应用上是很有用的,但是却很花时间,HALCON 有许多不同的 pattern 演 算法,可以让您自行决定何时使用。

HALCON 提供了形状导向(shape-based)的匹配计算,使得物体有重迭或是旋转杂置的状况 下仍可计算。除了 pattern 匹配外,形状导向的运算符可以在物体有缩放,照明改变,旋转 或重迭等等情况下仍旧能辨认出物体。从 6.1 版开始,还有一个辅助工具 HMatchIt,透过简 易的设定即可用来测试匹配执行的效率,藉由参数的调整让您找出最佳的设定值,达到最快 的计算速度。





HALCON 提供了方便有效的 tuple 功能

tuples 是一种很有用的功能,使您处理影像,区域,参数等等数据集合时更为便利。HALCON 的 tuples 可以将相关数据整合成一个对象,用户可以针对单一或多个 tuples 作处理,您就 不必为一个 tuple 中有多少元素要处理而烦恼,只要将指定的 tuple 丢给运算符,HALCON 就会处理 tuple 中所有要计算的元素。





HALCON 在影像和数据管理上效率卓著

HALCON 有个快速有效率的内存管理核心,这个机制提供了数据的读写,还有溢位的检 查。为了提高效率,共享的影像数据不会在内存中重复。





HALCON 支持 C,C++以及 COM 的程序设计

您可以在自己撰写的 C,C++和 COM 程序中使用 HALCON 运算符,完成一个独立的程序。





HALCON 的 HDevelop 工具帮助您发展影像分析程序 撰写影像分析程序通常是旷日费时,为了帮助设计人员找出合适的运算符及参数,HALCON 发展出一套工具程序 HDevelop。它如帮助您呢? 首先 HDevelop 有一个图形接口,要使用 的运算符和要分析的影像一目了然,运算符可以自行组合,计算成果实时显示在影像中,可

以帮助使用者了解不同运算符和参数对计算的影响。同时它也会提出一些运算符或参数的建 议,在线辅助除了解释运算符如何工作外,还有范例的说明。 当您觉得计算成果满意了,可以把设计好的成果存成 HDevelop 的专用档案,下次可再叫用, 或者是将其输出成 C,C++或 COM 的程序代码,可供其他程序套用,就像自行撰写的程序一 样。





HALCON 可连接 40 余种影像撷取设备

目前支持的设备列表在 http://www.mvtec.com/halcon/,要连接取像设备,只要用运算符 open_framegrabber,给予格式或撷取模式等参数,再来用运算符 grab_image 即可取得影 像。





HALCON 可以让您自行新增取像设备

如果您用的取像设备 HALCON 尚未支持,您可以利用专用接口连接。HALCON 有个开放的 接口,配合一些程序代码,就可以和 HALCON 连接,相关的说明请参考 Frame Grabber Integration Programmer''s Manual。





1.2 可执行 HALCON 的操作系统



下表说明了可执行 HALCON 的操作系统



Operating System Processor Compiler Windows NT 4.0 /2000 /XP compatible to Intel Pentium MS Visual Studio 3 Linux 2.2/2.4 compatible to Intel Pentium gcc 2.95 Solaris 7 SPARC CC 5.2 IRIX 6.5 MIPS CC Tru64 UNIX 5.1 Alpha cxx



可执行 HALCON 的操作系统一览表









请注意,在 Linux 下需要 libc6(glibc-2.1.x),这是在大部分的 Linux 系统像是 RedHat 或 SuSe

下需要的,请参考相关文件。

HALCON 也可以在 Philips TriMedia DSP 上执行,主计算机需安装 NT/2000/XP,这部分 请参考 HALCON/C 之 User''s Manual。

1.3 Parallel HALCON 简介



简单的说,标准版的 HALCON 是在单处理器的计算机上执行单线程计算,在 NT/2000/XP, Linux,Solaris,HALCON 是 thread-safe,也就是可以做多绪执行,不过所有的运算符执行 时都是独一的,所以线程间必须要互相等待。





相对来说,Parallel HALCON 支持平行运算,是 thread-safe 以及 reentrant,也就是不同的 线程可以同时呼叫同一个运算符,可使用的操作系统包含 NT/2000/XP,Linux,Solaris。





除了平行运算外,Parallel HALCON 在多处理器的系统上,会自动将运算符作平行化,旧的

HALCON 也有此功能,像是 HDevelop 这个接口,所以您开发的 C++,C,不必再做更动。





平行化的机制是将要处理的数据,例如影像,由不同的处理器上执行不同的线程(所谓的 data parallelism),例如一张影像的滤波运算,在一个四处理器的计算机上执行时,计算工作会 被分成四份,由四个线程负责,每个线程都是做相同的滤波计算。由于待处理的影像在 系统中不必复制,因此 HALCON 的这种设计构想可以达到最好的效率。





至于平行化或数据分配的的程度可以实时掌控,以免造成反效果,例如一张很小的影像,又 要将数据分散处理反而会浪费时间,此外,不是所有的运算符做平行化都能提高效率。





此外,parallel HALCON 是用于内存共享的系统中,像是典型的多 CPU 主板,这样不同 的线程才能共享一个 HALCON 数据库,同时也不必再复制影像而造成占用内存。这样 一来有些系统是不适合执行 HALCON 的,像是 cluster 式的工作站或是一些不提供共享记忆 体的系统。





Parallel HALCON 也不提供 COM 接口,包含平行化机制和 reentrant,这是因为撰写 COM

的主要工具,Microsoft 的 Visual Basic ,尚未有效支持多绪执行之故。

1.4 其他数据



下列的手册提供了各种参考数据





HDevelop User''s Manual

介绍与 HALCON 核心功能链接的图形用户接口 HDevelop。





HALCON/C++ User''s Manual

如何在您写的 C++程序中使用 HALCON library。





HALCON/C User''s Manual

如何在您写的 C 程序中使用 HALCON library。





HALCON/COM User''s Manual

如何在您写的 COM 程序中使用 HALCON library,例如使用 Visual Basic。





Extension Package Programmer''s Manual

如何自己设计一个运算符,并将其整合到 HALCON 中。





Frame Grabber Integration Programmer''s Manual。 如何将一个新的取像设备加入 HALCON 的系统中。(更新到8.0后这个手册就没有了,改为image acquire)





HALCON/HDevelop,HALCON/C++,HALCON/C,HALCON/COM

所有 HALCON 运算符的参考手册。





Application Guide

这是几份各自独立的文件,即所谓的 Application Note,是以工业视觉应用的观点来写的, 主要是说明一些计算方式的关键以及使用时的注意事项以及要诀等等。例如以型状导向匹配 来寻找物体等等。







在 MVTec 的网站上所有的参考手册都有 PDF 檔及 HTML 文件可以下载,网址为

http://www.mvtec.com/halcon

第二章 安装,授权以及设定





在未说明安装及设定方法前,先来看看不同版本及授权的相关说明





HALCON 有三种版本





1.demo 版,含 HDEvelop 以及完整的图像处理功能,但是有一些限制,例如不能连接取像 设备,也少了程序设计界面,这个版本可让您测试 HALCON 运算符的所有功能而无时间限 制。





2.完整版,让您可以用 HALCON 的功能发展程序。除了 HDevelop 外,还包含了所有取像功 能,C,C++,COM 之接口,还有 Extension package Interface,让您可以整合自定义的运算 子或是新的取像设备。





3.如果您用 HALCON 的功能写好程序,您可以得到一个 runtime version ,包含了程序中 需要的功能,这个版本就不包含 HDevelop。









使用完整版或 runtime 版,需要不同的授权码,而 demo 版可以不用户许可证码。授权使用方 式说明如下

1. Nodelocked license 用于固定地址的计算机或机器

2. 完整版上也可以使用所谓的 floating license,在局域网络中特定地址的机器可以使用,一 个 license server 会检查执行的 HALCON 程序数量。

至于作为 license server 的机器并非要真如一般的 server 般庞大,或是一定要是某种 server 系统,像是 Windows NT server,它可以是一台 Linux 或是 Solaris 工作站,然后在其他的电 脑安装 Windows NT/2000/XP 等以执行 HALCON,只要在 HALCON 执行时能和这个 server 连接就可以了。

如果是为了估价的目的,您可以用一个免费的 temporary license。





2.1 安装



以下说明如何由 CD 安装 HALCON,由网络安装的方法在网址 http://www.mvtec.com/halcon/download 有说明。名为 release_note.html 的档案有 HALCON 的最新消息。







除了 UNIX 的系统外,档案路径和环境变量是以 Windows 式的写法表示,例如

%HALCONROOT%\examples\extension_package\halconuser

请参考 2.4 节的说明





若是在 UNIX 系统下,写法就变成

$HALCONROOT/examples/extension_package/halconuser





注意

如果要安装大改版的新版 HALCON,例如 6.0 或 6.1 版等等,就必须先将旧版卸载,这 在 Windows 下尤其重要,因为必须要清除旧版在 registry 的纪录。移除方法请看 2.2 节。 有个例外是 ActiveVisionTools 1.0 到 1.3 版想安装 HALCON6.1 版,这时就要保留旧版的 HALCON 6.0.x。

如果只是小改版的更新,像是 6.0.1 升级成 6.0.2 版,有个特别的更新方法,在 2.1.3 节有说 明。







2.1.1 在 Windows NT/2000/XP 下的安装





将 CD 置入机器,就会启动一个安装程序,若没有自动执行,可在一个叫 nt-x86 的目录下, 执行一个名为 Setup.exe 的程序,当然,您必须要有 Administrator 的权限。 首先,程序会先检查系统资源是否足够安装,再来会检查是否已安装了 HALCON,如果已安 装了相同的版本,程序会检查已安装的部分,再让您安装新增加的东西。若是已安装了不同 版本的 HALCON,会问您要不要保留,至于如何在不同版本间切换,在 2.1.5 节有说明。 安装程序同时也会检查是否有安装 ActiveVisionTools,还有它的版本是否和目前要安装的 HALCON 兼容。

(请参考 2.1.5 节)

这些检查都结束后,安装精灵会要您选择安装版本如下





(Compact,Custom,Typical)Full HALCON version

(Runtime)runtime version

(Demo)demo 版的 hdevelop_demo.exe

一些额外的东西可以日后再安装,一样将 CD 置入执行,再选择您要的部分即可。 再来,如果您要用 dongle,安装程序会问您是否安装驱动程序,2.3.5 节有驱动程序的说明,

以及如何自行安装而不透过 HALCON 的安装程序。接着,程序会问您这台计算机是不是要当 成 floating license server,这样会安装名为 license manager daemon,来管理您的 floating license。floating license 的用户只要在一台计算机上安装这个程序即可当作 license server。 请参考 2.3.4 节。

2.1.2 在 UNIX 下的安装





您要先 mount CD,例如 /cdrom,通常您要有 root 的权限才能作这个动作,而在大部分 的系统下,CD 会被 mount 成 /etc/fstab,不能在此执行程序,所以要改成 mount

/dev/cdrom /cdrom

要安装时,启动 CD 主目录下的 shell script "install-unix",会问您 HALCON 要装在哪,接着 环境变量 HALCONROOT 也要设成安装的目录(参考 2.4.2 节),再来会问您 HALCON 的附 加部分要装在何处。

由于在 CD 上是只读的,如果您是以一般使用者来安装,在权限改变时会出现警告讯息,而 某些系统上会出现文件名长度超过 32 字符的讯息。 接着,会检查您的系统是否足够安装。安装完成后有几个环境变量要设定,HALCON 才能工 作。(请参考 2.4.2 节)





2.1.3 更新

HALCON 小改版的更新有一个特别的方法,例如从 6.0 或 6.0.1 更新到 6.0.2,更新方法请参 考 MVTec''s 的下载区 http://www.mvtec.com/halcon/download





关于 HALCON 6.0.2 版的特别说明

从 6.0.2 版开始,HALCON 要用新的 dongle 驱动程序(来自 GLOBEtrotter),但是更新方法 中并无解除旧版的驱动程序以及新版的安装,所以 HALCON 会出现"license not found"或类 似的错误讯息,因此您要用 2.3.5.1 节的方法自行将旧的驱动程序移除。





2.1.4 HALCON 系统里的各种档案以及目录 以下说明了安装目录%HALCONROOT%下的各种子目录以及档案内容,不过随着安装选项 的不同,有些目录不会出现。





FLEXlm 包含检查 license 的程序





bin HALCON 的主程序,像是 HDevelop,或是 DLL 檔,frame grabber 的 libraries 等等。





doc\pdf PDF 说明文件





examples 其中的子目录包含各类范例,例如

application_guide,配合 C,C++,delphi 之程序设计,fg_integration(影像撷取 接口),extension_package,hdevelop 之使用,MFC,VB 等等之范例。 注意,最好不要直接使用这些范例,因为在大部分的作业平台下,只有安装者可以修改或储 存这些范例,也不是所有用户都可以在范例的目录下新增储存东西。所以最好是自行复制 一份到自己的工作目录下。



images 各种工作所用的影像





include 给 C/C++程序使用的 header





lib HALCON 的 libraries,包含和各种取像设备相连接的驱动程序。(在 Windows 下扩展名 为.lib,UNIX 下则为.so)





license 授权数据文件要放在这里









2.1.5 不同 HALCON 版本间的切换





您可以同时安装不同版本的 HALCON 在同一台计算机上。在 Windows NT/2000/XP,安装时 要修改相关的环境变量,像是%PATH%,%HALCONROOT%,%HALCONIMAGES%,以 及自设的像是%HALCONEXTENSIONS%,这部分请参考 2.4.1 节。

如果您使用 HALCON 的 COM 接口,就要对专用的 DLL 檔 halconx.dll 做 re-register。例如, 开一个 DOS shell,然后进到 bin\i586-nt4 目录下(您的旧版 HALCON),先做 unregister,就 是在命令提示符号下键入

regsvr32 /u halconx.dll





然后到您的新版 HALCON 相对应的目录下,将 halconx.dll 做 register regsvr32 halconx.dll

在 UNIX 下,要转换不同的 HALCON 版本,则要修改相关环境变量,像是$HALCONROOT,

$HALCONIMAGES,$PATH,$LD_LIBRARY_PATH 等等。





2.1.6 给 ActivVisionTools 用户的信息

ActiveVisionTools1.0 到 2.0 版是以 HALCON6.0 版(或 6.0.1)为基础的,所以要是装了 HALCON 6.1 版,将会使得 ActivVisionTools 无法使用,所以 HALCON 6.1 的安装程序会 检查是否在计算机上已有安装 ActivVisionTools,如果侦测到安装了 ActivVisionTools2.0 版, 它会提供一个新的,和 HALCON 6.1 版相容的 OCX ActivVTools.ocx。一般来说这是您该做 的选择,您也可以事后手动修正如下,开一个 DOS shell,到您安装 ActivVisionTools 目录下 的 bin\i586-nt4 目录下,对旧的 ocx 做 unregist,键入





regsvr32 /u ActivVTools.ocx

然后将其删除,或是改名,换成新的 ocx,这在 CD 中的 misc\i586-nt4\avt20.下可以找到, 然后键入





regsvr32 ActivVTools.ocx





即完成更新





注意,和 ActivVisionTools2.0 不同的,1.0 到 1.3 版不能和 HALCON6.1 版一起使用(因为没 有兼容的 ocx),如果 HALCON6.1 版的安装程序发现计算机上安装了 ActivVisionTools,像是

1.3 版,它会警告您继续安装会使得现存的 ActivVisionTools 无法使用,若您还想使用,您就 得保留旧有的 HALCON6.0.x,同时用 2.1.5 节的方法来转换版本,如果只是要评估试用新版, 建议您安装试用版,这样就不必再 register COM 接口的 library halconx.dll。









2.2 卸载







2.2.1 Windows NT/2000/XP

在 Windows 下有几种卸载的方式(不过某些旧版的 HALCON 不一定适用)





1.在控制台下,选择 新增/移除 程序。

2.若您用的是 HALCON 5.1 以后的版本,从 开始>程序集>MVTec HALCON>Uninstall

HALCON 来卸载。

3.从 5.2 版起,安装程序会检查机器上是否已有安装旧版,然后您可以利用安装程序来解除 旧版的安装。

这是比较好的方法,这样可以避免路径的变量发生问题。

以上是标准的卸载法,如果遇到问题,请参考 6.5.2 节。 注意,卸载会真的删除安装的档案,不过不会删除用户设定的数据,也就是 registry

中,像是和 HDevelop 有关的一些自定数据不会被删除,保留在 HKEY_CURRENT_USER>Software>MVTev>Halcon 下。这里可以自行手动删除,不会出 问题。

卸载也不会移除 dongle 的驱动程序,要移除的话请参考 2.3.5 节的说明。

关于 6.0.2 版的特别说明

从这个版本开始需要一个新的 dongle 驱动程序,由于卸载不会移除旧有的驱动程序,所 以无法安装 6.0.2 版所需的新的驱动程序,所以在用程序进行卸载旧版的 HALCON 前, 要先以手动移除其驱动程序,请参考 2.3.5.1 节。





2.2.2 在 UNIX 下卸载

只要将 HALCON 所在的安装目录移除即可





rm -rf $HALCONROOT





再来,移除子目录 .hevelop,这是位在环境变量 HOME 所定义的目录之下(参考 2.4.2 节), HDevelop 是以这个目录来储存窗口位置,选项数据等。 卸载不会删除任何用户自定数据,因此环境变量也不会改变,要删除或修改时就要自 行手动处理。

如果您呼叫了 Parallel HALCON 6.0 beta 的 operator check_par_hw_potential 来做初始化动 作,取得的资料会存在一 .halcon_par_info 文件中,置于环境变量 HOME 所指定的目录下。









2.3 授权







HALCON 透过 FLEXlm license manager 来确认用户的授权数据,以下说明取得授权码 及其安装方式。

要取得授权前,先要取得欲安装 HALCON 计算机之辨识数据,送至代理商(新亚洲仪器公司), 若使用的是 runtime license,则请告知欲安装的模块。(请参考 2.3.2)

在您收到 license file 之后,请参考 2.3.2 节的方法来安装。floating license 的使用者请参考

2.3.4 节来安装。





2.3.4 取得辨识资料

取得辨识数据是由您计算机上安装的网络卡,若您的操作系统为 NT/2000/XP,处理器为 Pentium III,则能取得所谓的 CPU ID。在 Windows NT/2000/XP 下,也可以用一个 dongle, 只要有 dongle,就可以在其他计算机上执行,这样就不必限定在某台计算机上使用,而且适用于 nodelocked 或是 floating license 之使用者。详细说明请参考 2.3.5 节。





2.3.1.1 用 HDevelop 取得辨识资料

用 demo 版的 HDevelop 来取得辨识数据是最简单的方法。在主选单 Help>About,会出现如 下的一个窗口,最底下的数据就是关于您这部计算机的数据,像是网络卡卡号,CPU ID,dongle 号码等。













如果发生问题,既有的设备数据找不到,例如有网络卡而侦测不到,请参考 6.5.3 来排除问

题。





2.3.1.2 用 lmhostid 来取得资料





lmhostid 是随着 FLEXlm 的软件,在 Windows 操作系统下,由 DOS 下执行,在 UNIX 系统 中,则要切换目录,到$HALCONROOT/FLEXlm 下,再到对应您的硬设备的目录下(例如 i586-Linux2.2)执行之。

要辨认一台计算机的网络卡号,键入 lmhostid -ether

Windows 系统下的输出画面例子如下

> lmhostid -ether

lmhostid - Copyright (C) 1989-2000 Globetrotter Software, Inc. The FLEXlm host ID of this machine is "00e02958e36a"

请将 ID,就是上面例中的"00e02958e36a"以及计算机的 hostname 一起送给代理商。

如果 lmhostid 回传”ffffffff”,请依照 6.5.3.1 节的方法来处理。





要辨认 CPU ID,键入 lmhostid –cpu64

> lmhostid -cpu64

lmhostid - Copyright (C) 1989-2000 Globetrotter Software, Inc. The FLEXlm host ID of this machine is "0003-C1DE-01C3-E79F"

如果 lmhostid 回传"",则可能是因为在 BIOS 中 CPU ID 的选项关了,可在重新启动时将其

开启。

要检查 dongle ID(限于 Windows NT/2000/XP),则键入 lmhostid -flexid

会得到如下例之输出



> lmhostid -flexid



lmhostid - Copyright (C) 1989-2000 Globetrotter Software, Inc. The FLEXlm host ID of this machine is "FLEXID=7-36c79bd7"

注意,此时序号会写入 dongle 中





2.3.2 Runtime license 和 HALCON 的模块





HALCON 之运算符可分类成不同的模块,像是 "Basic operators",或是"Image/Region/XLD management",用于所有 HALCON 之功能,特别的像是"Background Estimation","1D Bar Code Reader"之类的,只用于特定的程序。使用 runtime 版时可以只包含您需要的模块。 您的程序中用到了那些模块,有两种方式来检查。

在 HDevelop 下执行的程序,可由选单下,File>Moduals,然后会出现一个如下图的窗口, 其中就有使用到的模块名称,然后按"Save",即可将这些纪录存成 .mod 文件,放在目前的工 作目录下。

由 C,C++,COM 所写成的应用程序,则需在程序结尾加入运算符 get_moduals。 然后将确定需要的模块名称送到代理商。





























































图例 您使用到的模块

2.3.3 安装 license file

要使用 HALCON 就要安装 license file,这个档案必须放在%HALCONROOT%\license 下, 档名需为 license.dat,如果是用 floatong license,您必须将这个档案复制到所有已安装 HALCON 的计算机上,包括作为 license verver 的计算机。

以下例子是一个 nodelocked license file 的内容。

############################

# MVTec (ID: 0080c77161e2) #

############################

FEATURE MVTec_Halcon mvtecd 6.1 permanent 0 FC17B37961F326F957A8 \ VENDOR_STRING=65535 HOSTID=0080c77161e2 ck=23

FEATURE MVTec_HDevelop mvtecd 6.1 permanent 0 CC279389F3566E1D6363 \ VENDOR_STRING=65535 HOSTID=0080c77161e2 ck=32



图例 nodelocked license,限用于某台计算机









您可以看到,档案中"FEATURE"接着 HALCON 的版本名称,而 license 是向下兼容的,举 例来说,6.1 版的 license 亦可以用于 6.0 版。同时,向上亦可用于小改版的升级,例如 6.1 版的 license 可用于 6.1.x 版。

#################################



# MVTec (ID: FLEXID=7-b285ff7f) #



#################################



FEATURE MVTec_Halcon mvtecd 6.1 permanent 0 3C574319AF86C4A5DE4A \ VENDOR_STRING=65535 HOSTID=FLEXID=7-b285ff7f ck=35

FEATURE MVTec_HDevelop mvtecd 6.1 permanent 0 7C772379E2D066930D10 \ VENDOR_STRING=65535 HOSTID=FLEXID=7-b285ff7f ck=245

图例 nodelocked development license ,限用于特定 dongle













#################################



# MVTec (ID: FLEXID=7-b285ff7f) #



#################################



FEATURE MVTec_Halcon mvtecd 6.1 permanent 0 3C574319AF86C4A5DE4A \ VENDOR_STRING=65535 HOSTID=FLEXID=7-b285ff7f ck=35

图例 nodelocked runtime license,限用于特定 dongle

2.3.4 floating license 之使用 在之前的介绍中已有概略的介绍,首先,要有一台计算机当成 license verver,安装一个名为

license manager daemon 的程序来检查网络中执行 HALCON 之计算机之数目,再来,license file 要 copy 到所有安装 HALCON 之计算机,而且也要 copy 到作为 license verver 的计算机上(参 考 2.3.4.3)。





接着来看看一个典型的 floating license。"SERVER"告诉 FLEXlm 当作 license server 计算机的 名称,这个例子里,就是 halconserver。还有网络卡号,以及 port number(27000)。

############################



# MVTec (ID: 0080c77161e2) #



############################



SERVER halconserver 0080c77161e2 27000



DAEMON mvtecd C:\Progra~1\MVTec\Halcon\FLEXlm\i586-nt4\mvtecd FEATURE MVTec_Halcon mvtecd 6.1 permanent 2 4C72DB2EC0F315624FAE \ VENDOR_STRING=16383 ck=97

图例 floating runtime license 的内容(限用于某台计算机)

某些情况下您可会想改变计算机的 hostname,例如您用的是 dongle-bound license,基于某些 需要想把 dongle 换到网络中另一台计算机上,或是您用限用于某网络卡的 license,而您想把 网络卡移到另一台计算机上。

您也可能会需要更改使用的 port,例如默认的 port 已被网络中某软件占用,但是要注意的, 大部分的计算机中,port number 小于1024的,只有特定权限的使用者能更改。 当您在网络中任一台计算机执行 HALCON 时,license file 中的"SERVER"后接着的数据,诸如 host name 和 port number 等等,是用于让程序寻找联系 license server,而在作为 license server 的计算机上,port name 是作为启动 license manager daemon 的依据,所以在计算机中, 所有复制的档案内容必须相同。

在您做为 license server 的计算机上,可能会需要修改 daemon 的目录 mvtecd,这目录通常如 下

%HALCONROOT%\FLEXlm\%ARCHITECTURE%\mvtecd

(关于环境变量 ARCHITECTURE 请看 2.4 节)

由于 license file 中没有环境变量数据,所以这个目录要自己新增。由于目录字符串中含有空白 字符时会造成 HALCON 的问题,所以当您将 HALCON 装在像是 c:\program Files\MVTec\Halcon 下时,路径字符串应改为 c:\progra~1\MVTec\Halcon。 最后一点,license manager daemon 必须在开机时启动。







2.3.4.1 在 Windows NT/2000/XP 下安装 license manager daemon

在 Windows 下,可以由安装程序来安装,然后他就会在重新启动以后自动启动,当然您也 可以自行手动安装,这要在 DOS 下键入(这是一整串指令)

"%HALCONROOT%\FLEXlm\i586-nt4\installs" -n "HALCON Licenses"



-c "%HALCONROOT%\license\license.dat"



-l "%HALCONROOT%\license\license.log"



-e "%HALCONROOT%\FLEXlm\i586-nt4\lmgrd.exe"





%HALCONROOT%即是安装的目录,在 Windows 下,安装好后必须重开机。如果安装成功, 一个称为 HALCON 的 service 会出现在控制面板下的系统管理工具的"服务"中出现。

要移除 liscense manager daemon,键入如下之指令





"%HALCONROOT%\FLEXlm\i58-nt4\installs" -r -n "HALCON Licenses"







2.3.4.2 在 UNIX 下安装 license manager daemon

在 UNIX 下,这个程序 lmgrd 必须放在适当的启动档中,像是/etc/init.d/boot.local 或

/sbin/init.d/boot.local,诸如此类。这部分请参考您使用的操作系统手册。 在这个档案中加入下面一整行(要有 lmgrd 的目录)





/etc/lmgrd -c $HALCONROOT/license/license.dat > $HALCONROOT/license/license.log

2>&1 &





注意,lmgrd 要由 root 启动,否则不能正常的作业。











2.3.4.3 重新启动 license manager daemon





如果您换了一个 floating license,就要将 daemon 重新启动。方法之一是重新启动计算机,如 果您有管理者的权限,也可以用手动方式新启动。在 Windiows 下,您只要在系统管理工具 下的"服务"中,将"HALCON License"这个服务重新启动即可。

在 UNIX 下,您可以终止 lmgrd 这个 process,然后再重新启动,启动的指令就是 2.3.4.2 节 中,加入启动档的那一行。











2.3.5 使用 dongle

dongle 只有在 windows 下才能使用,从 6.0.2 版起,还提供了连接 USB 的 dongle。连接印 表机埠的 dongle,其 ID 是以"FLEXID=6-"或"FLEXID=7-"开始,而 USB dongle 的 ID 是以 "FLEXID=9-"起。

2.3.5.1 连接并行端口的 dongle

就像 2.1.1 节所叙述的,您可以让 HALCON 安装驱动程序,要检查安装是否成功,可由装置 管理员来检视是否有一个叫 sentinel 的设备。

HALCON 也有一个辅助程序让您可以自行安装,设定,或是移除驱动程序。进到 DOS 下, 切换到%HALCONROOT%\FLEXlm\i568-nt4\flexid6-7\win_nt 目录下,执行 setupx86.exe。 要安装驱动程序,在主选单下选 Functions>install,然后重新启动计算机。然后用上述的检查 方法应该可以看到该项设备。要注意的是,您必须要有 Administrator 的权限才能安装驱动程 式。如果您没有权限,程序会也安装,并告诉您安装完成,而实际上无法作用。





要是计算机上有多个 parallel port,则还要再调整驱动程序。

HALCON 的卸载程序并不会移除这个驱动程序(因为其他程序有可能用到),但是却会把 这个安装程序移除,所以如果您要移除这个 dongle 驱动程序,就要在您将 HALCON 解除安 装之前完成。这个安装程序是在 CD 的 FLEXlm\i586-nt4\flexid6-7\win_nt,有需要时可再叫 用。





关于 6.0.2 版的特别消息

如同在 2.1.3 以及 2.2.1 节所叙述的注意事项,为避免出问题,建议以如下之程序进行安装。





手动方式解除旧的驱动程序。

用到的程序是 setupx86.exe,位于%HALCONROOT%\FLEXlm\i586-nt4\dongle 下。 再来就有两个方式可以安装 HALCON 6.0.2。

用 2.2.1 节的方法来移除旧版的 HALCON,然后将 6.0.2 版和新的驱动程序一起安装。 用 2.1.3 节的更新方法,也就是手动更新,用到的程序 setupx86.exe 位在

%HALCONROOT%\FLEXlm\i568-nt4\flexid6-7\win_nt 下。





如果您在移除旧版的驱动程序前先移除了旧版的 HALCON,这个 setupx86.exe 也会被删除, 但是它是位在 CD 中 FLEXlm\i586-nt4\dongle 下,若您没有 CD,建议您重新安装旧版的 HALCON。













2.3.5.2 USB dongle





如同 2.1.1 节,所需要的驱动程序可在 HALCON 安装时一起安装,安装是否成功,可由装置 管理员中查看是否有新增以下两项装置 Hardlock 以及 HASP。 随者操作系统的不同,您也可以用一个 HALCON 随附的辅助程序来修改,设定,移除驱动 程序。切换到 DOS 下,切换到目录%HALCONROOT%\FLEXlm\i586-nt4\flexid9,有个程序 hinstall.exe ,有下列指令可供显示,安装,移除等等。



hinstall 显示如何使用 hinstall

hinstall -info 显使驱动程序的状态 hinstall -install 安装驱动程序 hinstall -remove 移除驱动程序







当然,必须要有 Administrator 的权限才能安装。





由于 HALCON 的卸载程序不会移除 dongle 的驱动程序,但是会将安装程序 hinstall.exe 移除,所以若是要移除这个驱动程序,就要在卸载 HALCON 前进行。原始的程序在 CD 中的位置位于 FLEXlm\i586-nt4\flexid9。









2.4 设定







HALCON 需要设定的东西大部分都是环境变量,例如放置影像,放置 extension package 的 目录等等。要使用 Parallel HALCON 时,每一台分担计算的计算机上都要做初始化(initialize), 这部分会在 5.1.1 说明。







2.4.1 Windows NT/2000/XP 下的设定。

安装程序 Setup.exe 执行时会自动设定这些环境变量,像是%HALCONROOT%等,要查看 变量的内容,可用控制面板下的"系统"中查看,或是修改,新增变量内容。若是变量内容含有 不只一个项目,例如%PATH%可能含有数个目录,此时各个目录间就要以分号";"区隔之。 此外,要在安装时同时修改建立这些变量,必须要有 Administrator 的权限。





HALCONROOT

这是最重要的环境变量,指出了 HALCON 安装的目录。典型的变量内容内容像是 C:\Program Files\MVTec\Halcon。根据这个变量,HALCON 得以到以下的子目录中寻找资 料。





%HALCONROOT%\help

运算符的数据库位于此处。由 HALCON 来存取有关运算符的资料。





%HALCONROOT%\doc\html\reference\hdevelop

在线辅助说明,只要有一个浏览器就可以阅读其内容。



%HALCONROOT%\lut

使用者自定义之 look-up table。





%HALCONROOT%\ocr

存放了 trained fonts。





%HALCONROOT%\license

license KEY 置于此,也就是 license.dat 檔。





%HALCONROOT%\images

系统中没有 HALCONIMAGES 这个变数时,HALCON 会到这个目录找寻影像。





HALCONIMAGES

这是告诉系统影像数据存放的地方,其中可以包含数个目录,但是要记得用分号区隔之。





ARCHITECTURE

HALCON 用这个变量来区别操作系统,在 Windows 下,%ARCHITECTURE%即是设成

i586-nt4。

这个变量同时会在好几个地方出现,像是 HALCON 的程序,hdevelop.exe,halcon.dll 等等, 是置于%HALCONROOT%\bin\i586-nt4 下,要 link 程序用的 library 像是 halcon.lib,位在

%HALCONROOT%\lib\i586-nt4 下。





HALCONEXTENSIONS

这个变量含的目录,是用户自定义的运算符所在位置(所谓的 extension packages),每个 package 中含有数个运算符,linked 到一个共享的 library。还有一些说明文件,像是运算符 的 help,以及 HTML 檔。安装 extension package 请看 2.5 节的安装方法。





HALCONSPY

如果在启动 HALCON 前,系统中已有 HALCONSPY 这个变数,那么在 HALCON 启动时, 一个工具程序 HALCON Spy 也会启动。由运算符 set_spy 也可以将其启动(参数为"mode", "on"),两种启动方法的差异在于,有了

%HALCONSPY%这个变量,就可以监看一个 linked 好的 HALCON 程序,而不必再去修改。 相关设定请参考 6.4 节。





PATH

安装时,%HALCONROOT%\bin\i586-nt4 和%HALCONROOT%\FLEXlm\i586-nt4 会被加到

PATH 中。

2.4.2 UNIX 下的设定

在 UNIX 下,不同的 shells 设定环境变量的指令各不相同,例如 setenv , export =,这部分请参考您的操作系统说明。如果变量内容不只一个项目, 请用冒号区隔。





下表列出了 HALCON library 和 HDevelop 要用到的环境变量列表。最好把这些指令加在一 个 login script 或是 shell resource script 中,例如.cshrc 或是.profile 里。





HALCONROOT

这是最重要的环境变量,指出了 HALCON 安装的目录。典型的变量内容内容像是

/usr/local/halcon 或/usr/halcon。根据这个变量,HALCON 得以到以下的子目录中寻找数据。





$HALCONROOT\help

运算符的数据库位于此处。由 HALCON 来存取有关运算符的资料。





$HALCONROOT\doc\html\reference\hdevelop

在线辅助说明,只要有一个浏览器就可以阅读其内容。





$HALCONROOT\lut

使用者自定义之 look-up table。





$HALCONROOT\ocr

存放了 trained fonts。





$HALCONROOT\license

license KEY 置于此,也就是 license.dat 檔。





$HALCONROOT\images

系统中没有 HALCONIMAGES 这个变数时,HALCON 会到这个目录找寻影像。





HALCONIMAGES 这是告诉系统影像数据存放的地方,其中可以包含数个目录,但是要记得 UNIX 下要用冒号 区隔之。





ARCHITECTURE

这个变量以一个简写表示了所用的处理器以及操作系统版本。例如 i586-linux2.2,或是

sparc-sun-solaris7。ARCHITECTURE 会出现在好几个地方,像是程序 hdevelop 位在

$HALCONROOT/bin/$ARCHITECTURE。把$HALCONROOT/bin/$ARCHITECTURE 加到

PATH 变量中,在使用 shell script 时很好用。Shared library 位于

$HALCONROOT/lib/$ARCHITECTURE 下。下表为目前支持的作业平台以及对应的

ARCHITECTURE 内容。





ARCHITECTURE Operating System (Platform) i586-linux2.2 Linux 2.2/2.4 on Intel Pentium (or compatible) sparc-sun-solaris7 Solaris 7 on Sparc Workstations mips-sgi-irix6.5 IRIX 6.5 on SGI Workstations (Mips processors) alpha-compaq-osf5.1 Tru64 UNIX 5.1 5 on Alpha processors







PATH

如果想要在任一个目录都可以启动 HDevelop,就必须将 HALCON 的目录

$HALCONROOT/bin/$ARCHITECTURE 加进环境变量 PATH 中。





LD_LIBRARY_PATH

请将 HALCON library 的目录$HALCONROOT/lib/$ARCHITECTURE 加到

LD_LIBRARY_PATH 这个环境变量之中。 设好以后,HDevelop 和开发的独立的程序才能使用。





HALCONEXTENSIONS

包含一些使用者自定义的运算符(所谓的 package)所在的目录,每个 package 中含有数个运算 子,linked 到一个共享的 library。还有一些说明文件,像是运算符的 help,以及 HTML 檔。 安装 extension package 请看 2.5 节的安装方法。详细方法请参考 Extension package Programmer''s Manual。





HALCONSPY

如果在启动 HALCON 前,系统中已有 HALCONSPY 这个变数,那么在 HALCON 启动时, 一个工具程序 HALCON Spy 也会启动。由运算符 set_spy 也可以将其启动(参数为"mode", "on"),两种启动方法的差异在于,有了$HALCONSPY 这个变量,就可以监看一个 linked 好 的 HALCON 程序,而不必再去修改。相关设定请参考 6.4 节





DISPLAY

系统以这个变量来显示窗口,和其他的 X 窗口程序一样。





HOME

在 Parallel HALCON 6.0 beta 中,做初始化的运算符 check_par_hw_potential 会将取得的 主机数据存于 $HOME.halcon_par_info。

2.5 整合 HALCON Extension Package



HALCON 的 Extension Package Interface 可以让您将自行开发的计算法和 HALCON 整合 在一起,成为所谓的 extension packages。目前可以使用的 package 项目可由 HDevelop 之 选单 Help>HALCON News(WWW),连结到 MVTec 的网站来取得资料。







2.5.1 安装 Extension package

先将这些 package 移到%HALCONROT%目录下,解压缩,再来,将完整的目录

%HALCONROOT%\packages\halconuser 加到环境变量 HALCONEXTENSONS 中。





注意,package 的名称,以及其中所含的 library 或 Dll 档的名称都不可以更改。否则会无法 用使用。





如果 package 中含有影像,例如说含有一些范例影像您要使用,可以将其影像所在的目录加 入环境变量之中(HALCONIMAGES),要使用这些影像时就不必再输入完整的路径。







2.5.2 在 HDevelop 中使用 Extension Package

在 HDevelop 下要使用新的 package 时,只要将程序重新启动,就会自动整合位于 HALCONEXTENSIONS 所载目录中的 packages。各种新增的运算符在使用上和 HALCON 原有者并无二致。

在 Linux 下,必须在您启动 HDevelop 前,将 package library 所在的子目录 lib/i586-linux2.2

加入环境变量 LD_LIBRARY_PATH 中。









2.5.3 在一个独立的程序中使用 Extension Package

您必须在程序代码中将这些 package library(像是 Windows 下的 Dll,UNIX 下的 shared library)link 进来。

2.5.3.1 在 Windows NT/2000/XP 中使用 Extension Package

如果要用 C 或 C++写新的程序,要将 packagec.lib 或 packagecpp.lib 连到您的 obj 檔,当然 基本的 library,像是 halconc.lib 或是 halconcpp.lib 也要 link 进来。

要能 link 这些 Dll,系统的环境变量 PATH 就要含有完整的路径像是





%HALCONROOT%\packages\halconuser\bin\i586-nt4





此外,不要把这些 Dll 文件复制到 Windows 的系统目录下,否则执行时会被重复加载。

2.5.3.2 在 Linux 中使用 Extension Package

如果要用 C 或 C++写新的程序,要将 libpackage.so 或 libpackagec.so 或 libpackagecpp.so 等档案 link 起来,当然基本的 library,像是 libhalcon.so 或是 libhalconc.so,libhalconcpp.so 等等也要 link 进来。

要能使用这些 LIBRARY,系统的环境变量 LD_LIBRARY_PATH 就要含有完整的路径像是

lib/i586-Linux2.2







2.5.3.3 在 Solaris 中使用 Extension Package





如果要用 C 或 C++写新的程序,要将 libpackage.so 或 libpackagec.so 或 libpackagecpp.so 等档案 link 起来,当然基本的 library,像是 libhalcon.so 或是 libhalconc.so,libhalconcpp.so 等等也要 link 进来。

要能使用这些 LIBRARY,系统的环境变量 LD_LIBRARY_PATH 就要含有完整的路径像是

lib/sparc-sun-solaris7







2.5.3.4 在 IRIX 中使用 Extension Package

如果要用 C 或 C++写新的程序,要将 libpackage.so 或 libpackagec.so 等档案 link 起来,当 然基本的 library,像是 libhalcon.so 或是 libhalconc.so,libhalconcpp.so 等等也要 link 进来。 要能使用这些 LIBRARY,系统的环境变量 LD_LIBRARY_PATH 就要含有完整的路径像是

lib/mips-sgi-irix6.5







2.5.3.5 在 Tru64 UNIX(DIGITAL UNIX)中使用 Extension Package

如果要用 C 或 C++写新的程序,要将 libpackage.so 或 libpackagec.so 等档案 link 起来,当 然基本的 library,像是 libhalcon.so 或是 libhalconc.so,libhalconcpp.so 等等也要 link 进来。 要能使用这些 LIBRARY,系统的环境变量 LD_LIBRARY_PATH 就要含有完整的路径像是

lib/alpha-compaq-osf5.1

第三章 对 HDevelop 的初步认识





本章是入门使用者必须熟悉的章节,将介绍如何从头开始处理一个影像分析问题,在范例中 会介绍 HDevelop 重要的功能,让您逐渐习惯它的使用接口以及掌握有效的使用方法。 这个范例是属于品管领域的,目的是检查工件上的 bonding balls,范例位于 HALCON package 的子目录下



%HALCONROOT%\examples\hdevelop\Manuals\GettingStarted\example.dev





范例中会介绍





如何用 HALCON operator 建立一个 HDevelop 程序。 如何找到合适的 operator 以及其参数。 如何使用图像及控制变量。

如何使用图形窗口。 如何产生 ROI。 如何利用型态学的方法来解决范例中的问题。 如何使用 pattern 匹配。

如何使用 control struct。









仔细的读完这一章,您会熟悉 HDevelop 的各种交互式接口,让您能够自行开发自己专用的 影像分析程序。









图例 要分析的影像:工件上的 bonding balls

3.1 HDevelop 的用户图形接口 GUI。







在 Windows 下,由"开始">程序集>MVTec HALCON>HDevelop 启动,在 UNIX 下则是由 shell 中启动 hdevelop。程序启动后可以看到一个主画面,其中包含了四个窗口,Program, 运算符,变量,影像等。以下是简单的介绍,至于详细的内容请参考 HDevelop User''s Manual。





3.1.1 主画面





如下图所示,它整合了程序发展以及作业管理功能(像是 loading,saving),选单以及工具栏。













































































图例 主画面 主选单

主选单中包含了所有 HDevelop 的功能,如下表所列。



File 加载以及储存 HDevelop 的程序,或是结束 HDevelop 之作业。

Edit 编辑 HDevelop 的程序。 Excute 执行 HDevelop 的程序。 Visualization 自定义影像窗口外观。

operators 子目录中含有程序结构,HDevelop 之运算符,以及所有的 HALCON 运算符。

Suggestions 提供选用运算符的建议。

Windows 各个窗口的管理(重迭,排列,切换等) Help 开启说明档。







工具栏

工具栏含有一系列常用功能的快捷方式,同时掌控了 HDevelop 程序的执行。





New 删除 program windows 中目前的程序。

Open 开一个新的 HDevelop 程序。

Save 储存 HDevelop 程序。





Cut 删除程序中选起来的程序代码。 Copy 复制程序中选起来的程序代码。 paste 贴上程序中选起来的程序代码。





Run 执行 HDevelop 程序。

Step 执行 HDevelop 中下一个程序指令。

Stop 终止程序的执行。





Avtivate 使程序中选取的部分指令可被执行。 Deactivate 使程序中选取的部分指令被忽略。 Reset 重新启动程序并重设所有变量。





set parameters 显示 visualization 参数的窗口。





Pixel info 显示 pixel info 窗口。

Zooming 显示实时缩放窗口。

gray histogram info 显示频谱数据。

Region info 显示 ROI 中的各种资料。

3.1.2 program 窗口

这个窗口是用来显示一个 HDevelop program。它可以显示整个程序或是某个运算符。窗口 左侧是一些控制程序执行的指示符号。HDevelop 刚启动时,可以看到一个绿色箭头的 program counter(简称 PC),一个插入符号,还可以设一个断点(breaking point),窗口右 侧显示程序代码。





3.1.3 运算符窗口 您所选择的运算符的重要数据会显示在这里。包含了所有的参数,各个变量的型态,以及参 数数值。这里会显示参数的默认值,以及您可以选用的数值。每一个运算符都有联机帮助。 另一个常用的的是变量名称的查询显示功能,在一个 combo box 里,只要键入部分字符串甚 至开头的字母,即可显示所有符合名称的运算符供选用。









3.1.4 变量窗口 这个窗口显示了程序在执行时产生的各种变量。在变量上用鼠标双击之,即可显示变量值。 如果变量值包含了影像数据或 ROI,所谓的图像化变量,会显示在图形窗口里。









3.1.5 图形窗口 用来显示图像化变量数据,可视化的方式可以依据您的需要来调整,相关功能位于 Visualization 选单下。您可以开启数个 graphic 窗口,并且自行选用要用的窗口。









3.2 编辑 HDevelop 程序

HDevelop 启动以后,就可以开始从 program 窗口输入,逐步建立您自己的 HDevelop 程序。 要在程序中新增一行,像是加一个运算符,有两个步骤。





首先要将光标放在您要新增的地方,用键盘的 Shift 键加上的鼠标左键,点在您要加入的地方

(插入符号位于窗口左侧)。

接下来从 Operator 选单中选择,或是由运算符窗口来选用想要加入的数据。





新的(选好的)运算符会出现在 运算符 窗口中,包含它的参数等等数据,此时按下 Enter,就 会将它加入程序代码中,成为新增的一行。如果您按的是 OK,除了程序代码会新增以外,同时 也会执行程序。如果您按的是 Apply,运算符不会新增到程序中,但是会被执行,这样就可 以方便又有效的测试修改参数的结果。





如果只要执行某一行,可以将 PC(Program counter)置于要执行的那行前,再用鼠标左键在 该行前单击,然后按 HDevelop 工具栏的 Step。如果您按了 Run,接下来的程序代码都会执

行,直到一个断点或是按 Stop 将其中止。在程序代码中点一下,就是选择了这一行,双击, 会将该行数据显示在 运算符 窗口中。

程序完成后,可以将其储存供日后叫用,或是输出成 C,C++,COM 的程序代码,产生一个独 立的程序,在选单中 File>Save as 即可储存。 以上叙述的这些基本操作在范例程序中会经常用到,您将有许多机会熟悉这些操作,接下来 将叙述如何加载影像。





3.3 加载影像



开始作业时,必须新增一个 HALCON object 来放置您的影像。取得影像的方法有数种。 利用取像设备取得实时的影像(由选单 Operators>Image>FrameGrabber)。 由现存图像文件读取(由选单 File>Image 以及 File>Read Image)。 自行产生一个新影像(由选单 Operators>Image>Creation)。





































































图例 赋值运算符 read_image 之参数









上例中用到 运算符 read_image,可以从主选单 Operators>File>Images 选择,或是在运 算子 window 中的"Operator"文字输入栏手动键入,再按 Enter。此时这个运算符应该会如上 图般出现,第一个字段是要新增的 image object 名称,现在自行把它改成"Die",用鼠标左键

在字段中单击,就可以输入。第二个字段是图像文件档名,将其改成"Die3"





read_image(Die,"Die3")





这个运算符有两个参数,都指定好以后按 OK,系统就会将其加进 program window 中并且 执行,到此您已完成第一行程序。变量 "Die",包含了一个 image object,会显示在变量视 窗中,同时在这个例子里,运算符的运算结果会显示在图形窗口中。如果加载影像时发生错 误,请检查环境变量是否设对。如果系统中环境变量 HALCONIMAGES 没设,影像数据就 要放在%HALCONROOT%\images 指定的目录下。













3.4 修改图形窗口



由于默认的图形窗口尺寸为512*512,因此您的影像尺寸不同时,显示在屏幕上就会 变形,虽然可以用鼠标拉动窗口四周来调整尺寸,但是要看到无变形的影像,最快的方法是 由选单 Visualization>Size Window>Original,即可自动调整窗口。由于以后的例子中要用到 window 的 ID,所以现在要用 HDevelop 的运算符来新增一个图形窗口,其中参数 Width 和 Height 是窗口的大小,如果不知道确实的尺寸,就给他"-1",即是最新开启的影像大小。





dev_open_window(0,0,-1,-1,black,WindowID),





按下 OK,就会产生一个新的图形窗口,同时尺寸和您的影像相符。不过这个窗口目前是黑 的,现在它已是"Active",您输入的数据就会显示在上面。此时,在变量窗口中双击图像变量 "Die",就会显示影像。 默认的影像检视方式是显示像素的数组,当然也可以用其他方式来观察,例如从 Visualiation>Set Parameters>Paint ,选 3D-plot,再来按 Update,就可以看到以 3D 显示 的 image。其他各种显示方式在 HDevelop Users Manual 有详细说明。在这个范例中,别忘 记将显示方式转回默认方式。所有的显示模式都可以由程控切换,例如显示频谱可由 dev_set_paint(''3D-plot'')行之。

您也可以缩放影像。由选单中 Visualization>Set Parameter,选 zoom 项,按上面的 "Interactive"键,就可以用鼠标选择要放大的区域,用鼠标左键按住拉动,从放大区的左上角 到右下角,放开,然后右键单击。要回复原有尺寸,在刚才的画面中按"Reset"键即可。

3.5 产生 ROI



在待处理的影像中指定一个 ROI 是非常有用的,由于只要计算指定区域内的影像,因此可以 大幅提升效率。





图例 矩形和任意形状的 ROI





产生 ROI 有几种方式 矩形的 ROI

由选单中 Operators>Graphics>Drawing 选择 draw_rectangle1 这个运算符,不要修改任何 参数,执行之,在程序窗口中就会新增一行,然后 HDevelop 就会等您把区域画上去,画的 方法和 zoom 的方法相同。画好之后变量窗口中会出现四个变量,Row1,Column1,Row2, Column2,请看下图,接着要产生 ROI 做为 HALCON 的 object,由选单中 Operator>Regions>Creation 选用 运算符 gen_rectangle1,此时使用的参数就是从 Row1 到 Column2 等等,输出对象的名称可以自定义为"ROI"。





两个运算符使用的参数



draw_rectangle1 (WindowID, Row1, Column1, Row2, Column2)



gen_rectangle1 (ROI, Row1, Column1, Row2, Column2)





执行这个运算符,您就产生了另一个 HALCON object,也就是 region(请看 4.2.3 节)。





图例 变量窗口















预设的 region 表示法就是用特定颜色在图形窗口中画出 region 的形状。您也可以自行修改 输出方式,像是颜色,线条粗细等等。从选单 Visualization 或是用 dev_.等运算符来作业, 例如由 Visualization>Color 来选颜色,Visualization>Line>Width 来改变线宽, Visualization>Draw 来指定画区域外围或是填满颜色。改变图形输出方法以后图形窗口都会 更新,要显示变量窗口中某个图像化变量,在上面点两下即可。











任意形状的 ROI

HALCON 可使用任意形状做为 ROI 区域。用选单 Operators>Graphics>Drawing 之

Draw_region,而不是用之前的画矩型的方法。





draw_region(ROI,windowID)





为了要让程序正确运作,请把其中 draw_rectangle1(在程序窗口中单击这一行就可以选 取)用 Edit>Deactivate 使其不执行,同样的,gen_rectangle1 也让它不执行。











计算适合的 ROI

用计算来找出 ROI 是利用影像分析的中间结果,这是最有挑战性,变化弹性最大的部分。在

3.8 节的例子中会介绍如何找出工件上的球型物。

当您产生一个 ROI 以后,可以用 reduce_domain,(Operators>Image>Domain),将影像约 化。其中 Die 为输入之影像,ROI 为输入之 region。





reduce_domain(Die,ROI,ImageReduced)

mean_image(ImageReduced,ImageMean,11,11)_





本例中输出影像名为 ImageReduced,只包含了 ROI 的部分,按 Clear 键清除画面,然后在 变量窗口中双击 ImageReduced 这个变量就可以看到约化的效果,此时您可以用一些运算符 对原始影像和 reduced 影像做运算,观察在效率上的差异。例如用 Operators>Filter>Smoothing 中的 mean_image,数入影像用原始影像"Die"。然后再按 一下 Clear 键清除画面,在程序代码 mean_image 这行上双击,就可以输入参数,在这里把 输入的影像改为 ImageReduced。

要重复上列方式来观察不同 ROI 的差异,可以把 PC(program counter)放在 draw_rectangle 或是 draw_region 上,(看您用哪个方法)再按 RUN。要在某个运算符计算前中止程序,只要 在其前面放一个 BP(break point),按 Ctrl 键加上鼠标左键即可加上。



















3.6 寻找正确的运算符







上一个单元中已经做出了一个 HALCON 对象,接下来要如何选用 HALCON 的一千多个运算 子呢? 主要是根据所要进行的分析工作而定,这要依靠用户的经验以及对于影像分析领域 的知识。虽然如此,HALCON 还是提供了一系列的方法,使得选择运算符更为正确而便利。





图例 用"thresh"字符串来选择"threshold " 运算符

如果您知道运算符名称的部分字符串,只要在运算符窗口中的文字输入栏输入,所有含有符合 字符串的名字就会列在 combo box 中。

每个 HALCON 的运算符都有 HTML 格式的说明,从 Help>HTML 启动您预设的浏览器就可 以看。从这里可以看到所有的影像分析模块,排列方式和选单中的 Operator 一样。相关的运 算子间还有交错的连结可以参考。 还有一个索引,包含了所有的运算符,您可以从这个索引直接跳到要找的 HTML 数据。 另外,还有一个 Suggestion>Keywords,提供您从一些功能上的关键词,让您去找寻要用 的运算符。窗口左边是分类的功能叙述列表,例如 3d-projection,Arcs 等等,用鼠标点一下, 窗口右侧会列出相关的运算符,在左边多点几下,右侧的列表内容就会一直增加。要选用运 算子时,在右边的列表中点一下,

就可以切到运算符窗口来作业。





选好了运算符,像是例子里的 read_image,就可以从 operator knowledge base 中取得各类 参考数据。





HTML 格式的联机帮助。

在运算符窗口中按下 Help,就会启动默认的浏览器来显示所有相关的说明。





选单 Suggestion>Altinatives 在计算个过程中若是觉得结果不完全符合需求,可以从这里寻找功能类似而可能更合用的运 算子。要注意的是,通常您必须在速度和精度之间做一选择,例如用速度较快的 mean_image 做为某种情况下的 filter,要求高质量的结果时,用 gauss_image 或是 smooth_image 。





选单 Sugestions>See also

这里会列出另一类可能相关的运算符让您参考,例如在用 read_image 时,列出 write_image。





选单 suggestion>Predecessor 许多运算符在运作时需要其他运算符提供计算参数或数据,这里会列出先相关数据,例如要 用 junctions_skeleton 计算 skeleton 的交点时,要先用 skeleton 完成 region 之中 skeleton 的萃取。





选单 Suggestion>Successor 和上一项建议相反的,某些运算符后面常常会接着一些特定的运算符做后续计算,这里会提 出一些合理的运算符供您选择。





到目前为止,我们的例子只是产生了一个新影像,而后续还有非常多可以选用的运算符来做 各式各样的计算,我们暂且选用 successor 中建议的 threshold 来做下一步的运算。

3.7 找出正确的参数值



当您选择了一个运算符,例如在程序代码上双击或从选单中选择,运算符以及其相关变量会 出现在运算符窗口中。您可以自行键入所有参数,但是大部分的情况下,从 combo box 中选 择适当的参数显然最为便利,而一些参数的默认值,是由 HDevelop 所提供。 例如,从选单中 Operator>segmentation 选用 threshold 来处理影像,输入的影像名称由 combo box 中选"Die",参数中的 lower 及 upper threshold 的默认值,会使您输入的影像, 以其中灰度值大于128的部分做为输出的区域。输出的影像名称可自行名为 Brighregion。 为了让输出区域显示更为明了,可以更改图形窗口的 visualization mode,由选单或是在图形 窗口中右键单击,在"Draw"中选"Fill",这样就会使输出区域填上颜色(颜色可由 Color 中选择, 例如选绿色)。要观察结果时,可以在图像变量区,双击"Die"或是"Brightregion",影像和 处理后产生的区域即可以分别显示。









图例 "BrightRegion"中包含了灰度值大于等于128的像元





想要修改参数时,在程序代码上双击,就会出现对应的运算符窗口,然后您就可以修改参数。 这个时候您可以按 Apply,这个运算符会被立刻单独执行并且显示结果,这样就不必一直从 头再执行一次,参数的调整达到您要的效果以后,就可以按 OK,将修改部分写入 program 中。要注意的是,在每次显示计算结果时要记得 Clear 画面,或是将原始影像重新显示一次, 以免显示计算结果的区域或线条等等累积在画面中重迭。

3.8 寻找 ROI



由影像"Die"中可以发现,由于线路版的部分比较亮,因此由 threshold 的预设参数 128 及

255,即可产生一个合理的 raw segmentation,然后把这个区域转成一个 ROI,做为 bonding balls 侦测之用。选用 shapr_trans,以"Brightregion"为输入区域,参数用"rectangle2",来找 出一个包含"Brightregion"最小的平行四边型。输出的 region 取名为"ROI",差不多就是电路 板的大小了。再来用 3.5 节的方法 reduce_domain,把原始影像约化成包含 ROI 的范围。









threshold(Die,Brightregion,128,255) shape_trans(Brightregion,ROI,''rectangle2'') reduce_domain(Die,ROI,DieROI)



接下来的计算,范围就定在最后的 DieROI 这张影像。













3.9 从型态学的方法来找球型物体







观察一下"Die"这张影像,您会发现这些 bonding balls 的部分比电路板上大部分区域还黑, 因此可以再用 threshold 来处理一次。





图例 region "RawSegmentation" 包含了较黑的像元 影像中免不了会有噪声而造成许多小洞或是小点,因此要用一个有适度限制条件的"填补"功

能,例如 运算符 fill_up_shape(在 Operator>Regions>Transformation)就颇合适。









threshold(DieROI,RawSegmentation,0,50)

fill_up_shape(Rawsegmentation,Wires,''area'',1,100)





此时,您可以在图像上点两下,比较 Wires 以及 RawSegmentation 这两个变量的图形有何 差异











































图例 用 open_circle 来移掉不要的部分 不过到此时,影像中除了 bonding balls 的部分之外,还有其他连接到 bonding balls 的深色

部分,而 bonding balls 本身很明显是一个圆形,因此可以用 opening_circle 来移除非圆形的 部分。





opening_circle(Wires,BallRegion,15.5)





再看看 Wires 和 BallRegion 之间的差异。 现在留在图面上的东西就剩下几个,由圆形元素所填成的几个物体,但是这些物体是包含在 影像中的,其实只是影像中的一些灰阶特征,如果要做后续计算时,必须把这些物体抽出, 变成一个个独立的物体,这时候就要用到 connection 这个运算符。





connection(BallRegion,Balls)









经过这个运算,原本在 BallRegion 里的物体就被拆成八个独立对象,存放在新产生的对象叫

做 Balls,现在可以试试用不同的颜色表示。 Visualization>Colored 选12,这样就可以见 到不同的物体分别被以不同颜色标示,这是 HALCON 非常重要的功能,这些所谓的变量并 不是只能有单一数值或资料项,它是一个tuple,而在运算符计算时,给予的参数可以 是一个 tuple,计算时就会处理数据所有对象,而不必再一个个分别计算,这时您就不必在程 式中安排循环来做这些重复的动作。





最后要找出圆形物体,此时要剔除其他非圆形物体就简单多了,用 select_shape,在

Operators>Regions>Features 中,参数选用"circularity",





select_shape(Balls,FinalBalls,''circularity'',''and'',0.85,1.0)





现在再来看看 Die 和 FinalBalls 这两个变数。FinalBalls 中只含有七个球状物,这就是要找的 东西,下一个单元中会介绍如何量测。 以上所举例子中,用到的运算符及计算的全部过程正如下列般简单。

dev_open_window(0,0,-1,-1,black,WindowID)

read_image(Die,''die3'') threshold(Die,Brightregion,128,255) shape_trans(Brightregion,ROI,''rectangle2'') reduce_domain(Die,ROI,DieROI) threshold(DieROI,RawSegmentation,0,50) fill_up_shape(Rawsegmentation,Wires,''area'',1,100) opening_circle(Wires,BallRegion,15.5)

connection(BallRegion,Balls)

select_shape(Balls,FinalBalls,''circularity'',''and'',0.85,1.0)









3.10 控制变量



现在我们已经找出了影像中的 bonding balls,接下来就可以做一些量测,例如说计算它们的 数量,用 count_obj(在 Operators>Object>Information 下)





count_obj(FinalBalls,NumBalls)





和 3.5 节的 draw_rectangle1 类似的,现在又产生了一个新的变量 NumBalls。HALCON 提 供了许多的特征辨认功能,(Operators>Regions>Features),现在可以再试试一个 smallest_circle,它的功能是在找出一个包含一 region 的最小圆,圆心位置以及半径。





smallest_circle(FinalBalls,Row,Column,Radius)



FinalBalls 含有七个对象,也就是七个圆,所以输出的数据 Row,Column,Radius 也都含

有七个数据,从变量窗口中就可以看到,要是对象含有的数据太多了,在窗口中无法一次完 全显示,可以在要查看的变量上双击,会出现一个窗口来显示全部数据。





接下来要对求得的控制数据作处理,这时要用到的是一些内建的功能,例如您可能会想要计 算 Radius 的平均值,而为了指定输出的变量,用的功能是 assign,(在 Operator>Control 下)





assign(meanRadius,sum(Radius)/|Radius|)





*注意,''||''中求的不是绝对值,而是 tuple 数据的数目,这个例子中就是7。 显示在程序窗口中就如下列。



meanRadius := sum(Radius)/|Rdaius|





在品管方面比较合理的应用是计算球的面积,或是再找出最小面积,用 area_center(在 Operators>Regions>Features 中),算出每一个球的面积,然后找出一个最小值,用 assign 把值指定给 minArea。





area_center(FinalBalls,Area,RowCenter,Colcenter)

minArea := min(Area)





控制变量的 tuple 也可以做为输入的参数,例如,把计算出的圆画在窗口中

disp_circle(WindoID,Row,Column,Radius),就可以画出七个圆。









3.11 用 pattern 匹配来找寻 bonding ball



在上一节中介绍了利用 threshold 找出 ROI,再加上型态学的方法找出要的圆形,在这一节 中,要介绍的是用一种完全不同的方式来来找出标的物。进行 pattern matching 时有两个基 本的步骤。





1.产生一个 template





2.在影像中找寻这个 template





图例 影像中圈出的 template





在这个范例中,会介绍如何产生包含这个 bonding ball 的一个 template dev_close_window() 关闭图形窗口

dev_open_window(0,300,-1,-1,''black'',WindowID) 产生一个新窗口,并且产生一个 window 的 ID,供下一个运算符 使用

read_image(Die4,''C:\\Program Files\\MVTec\\HALCON\\images\\die4.tif'') 读取图档

draw_rectangle1(WindowID,Row1,Column1,Row2,Column2) 框取 template,取得座 标。

gen_rectangle1(ROI,Row1,Column1,Row2,Column2),用这组坐标产生一矩形

reduce_domain(Die4,ROI,ImageReduced) 产生 ROI,名为 ImageReduced





现在 ImageReduced 中就只含有要搜寻的 bonding ball,再来就要产生一个 template,由

Operators>Filter>Match,选用 create_template





create_template(ImageReduced,5,4,''sort'',''original'',templateID)





为了要显示 matching 的成果,需要计算 template 中心,用 assign 来指定计算出来的数值。





TemplRow := (Row1+Row2)/2

TemplCol := (Col1+Col2)/2





接下来就是进行 matching 计算,在这里会用到两种计算法,用两个计算步骤,先用快速的

matching 来找出所有可能的区域,第二个步骤再用精确的计算,在每一个可能的区域中精确

定出正确位置。首先用的运算符是 fast_match,在 Operators>Filter>Match 下。





fast_match(Die4,Matches,templateID,20)





此时在变量窗口中 matches 上双击,画面上会出现七个点,此时用的参数 MaxError 设2

0,这个容许误差参数的调整影响到计算速度。用较小的数值可能会造成某些物体未被找出, 较大的数值则会增加计算时间。

除了 fast_match 之外,还有另一个运算符 fast_match_mg,可以调整不同的计算 level,您 可以试试不同的 level 对速度的影响。





fast_match_mg(Die4,Matches1,TemplateID,20,3)





在找出了可能的区域之后,接下来用 connection 把这些区域拆开,放进一个 tuple,做为最 后精确计算时的数据源。





connection(Matches1,BallROI)





如果各种参数都设定得很适当,这个图中应该会找到七个 region,我们可以用 count_obj 来 确认数目





count_obj(BallROI,NumBall)





最后再用精确的匹配 best_match。但是在精确匹配之前要先做一个动作,由于 connection 产生的对象 BallROI 是一个 region 的 tuple,本身不含影像数据,但是匹配计算需要依据原 始影像,因此要先在 region 中填入影像数据,用 Operators>Image>Domain 下的

add_channels add_channels(BallROI,Die4,BallImage)

best_match(BallImage,TemplateID,20,''true''Row,column,Error)





此时在变量窗口中会显示出计算出来的 Row,Column,Error 等等数据,在这些变量上按两 下,就会出现一个小窗口,列出所有数值(应该有七个)。 最后为了显示成果,可以在画面上依据计算成果绘图,在 Operators>Graphics>Output 下, 用 disp_rectangle1





disp_rectangle1(WindowID,Row+Row1-TemplRow,Column+Column1-TemplCol

Row+Row2-TemplRow,Column+Column2-TemplCol)



由匹配找出来的区域会被标上框框,这样就能很清楚的看到结果。

最后,如果这个 template 不再使用了,要用 clear_template 将其清除,这样就可以将 template

所占用的内存释放。





3.12 控制结构







HALCON 提供了一系列控制结构的逻辑和循环运算等等,让您可以组成更复杂的功能,例如 用for组成循环,用if来进行判断。

在上一节的例子中,我们用 best_match 的成果来显示矩形,不过这样万一有计算失败的情 况发生时显示的矩形就会出问题,只要把 MaxError 调到5,就可以在画面上看到发生了什 么情况。在输入的计算区中要是匹配失败,Row 和 Column 会变成0,Error 值变成255。 为了修正这个问题,我们可以设计一个循环,且加入一个判别式,在 Error 值小于255, 也就是计算成功的情况下才显示矩形,同时我们也可以据以统计真正计算出的物体数目。先 设一个变数当记数器,起始值为0。





RealNumBalls := 0





再来建立一个循环,计数器用 i,end value 用 NumBalls,这个循环里会判别成果是否正确, 然后才显示矩形,同时累计正确的成果数目。





for i := 1 to NumBalls by 1

if (Error[i-1]<255)

disp_rectangle1(WindowID,Row[i-1]+Row1-TemplRow,

Column[i-1]+Column1-TemplCol

Row[i-1]+Row2-TemplRow,Column[i-1]+Column2-TemplCol)

RealNumBalls := RealNumBalls + 1

end if endfor



这样一来,计算成功的地方才会显示框框,而计算失败时就不显示,即可避免将框框以(0,

0)为中心画在画面上。

第四章 HALCON 之设计哲理





4.1 模块架构































































HALCON 最基层的东西是 data management 以及 operator knowledge base。

data management 负责基本的内存管理,图像处理的存取,图像对象 tuple 的增删等等。 knowledge base 储存了运算符的数据,可在作业时同时取用,其他的模块用它来处理影像资 料,取得系统状态以及设定值数据等等。

knowledge base 也用于产生 HALCON 的语言接口(C,C++,COM),运算符的所有数据在 HDevelop,联机帮助以及手册中。同时也含有每个运算符的名称,参数形式,注意事项,预 设值等等。这些解说数据按照一定的结构排列。 在这两个模块上层的是运算符,大部分都是在 HALCON Image Processing Library 之中,而 这些模块可以透过所谓的 Package 来新增或延伸功能,这些新增的运算符和 HALCON 原有 的运算符有同样的特性和运用方式,因此系统的功能变成非常有弹性。利用相似的概念, Frame Grabber Interface 也是用动态的 library,因此用户可以自行新增和新取像设备链接 的接口,不必去更动系统的其他部分。

接下来是的模块是 Language-Independent Operator Interface,包含了呼叫运算符,数据输 入输出,以及传到最后输出的程序语言供用户撰写程序。运算符的功能是由 Language Interface 呼叫,这个接口是根据运算符的基本资料再编译输出而成的,它使您能够以自己撰 写的 C 或 C++,COM 等等程序中使用 HALCON 的计算功能。

4.2 iconic 和 control 数据的处理



HALCON 系统下有两种主要的数据型态,iconic 和 control 数据。iconic 数据是和原来的影 像相关的,例如说影像,region,XLD对象等等,而 control 数据报含各类的数值资料,像 是整数,浮点数,字符串等等,用以定义输入值,参数,建立更复杂的数据像是 bar chart,变 数数组等等,而 HALCON 在处理这两种形式的数据时,都是以 tuple 的型态在处理的。





4.2.1 tuple 的处理

HALCON 运算符的各种输入输出参数,只要是含有资料的,其内容可以是单一的对象或是 对象/数值的 tuple,HALCON 在计算时同时会计算 tuple 中所有对象。例如说您要对六张影 像做 filter 处理,可以使用 median_image 六次,也可以将六张影像读进一个 tuple,然后呼 叫 median_image 一次。当输入一个 tuple 时,HALCON 就会同时对六张影像作处理,然后 输出一个 tuple,其中含有六张处理过的影像。在第三章的例子中,从影像中取出的数个 region 变成了 tuple,如果要求取每个 region 的中心,只要把这个 tuple 做为 area_center 的输入参 数,输出的 tuple 就包含了这些 region 中心位置的坐标组。





4.2.2image 物件

image 对象中包含了像元数据。它本身可以是 tuple,含有一张或是多张影像,每个影像对象 本身含有一个 domain,记载了面积,范围,以及一或多个频道的灰度值数据,而频道的数 目没有限制,一个单色影像只有一个频道,一般的全彩影像有三个(RGB),多光谱影像可能 就更多。

影像的 domain 可以是任何尺寸,其范围是以 region 表示,所以其中可以有空洞,或是有数 个彼此不相连的区域,一张影像默认的 domain 即是包含该张影像的最小矩形。domain 可以 任意修改变形,而每一张影像都有个别的 domain。 每张影像给定其定义区域有其好处,所有的运算符在做计算时都只在 domain 的范围内计 算,也就是在 ROI 中计算,因此待计算数据减少,速度得以加快。HALCON 提供了一个范 例 autobahn.dev,位于

%HALCONROOT%\examples\hdevelop\Applications\Sequences





图例 image object 的架构









图例 各种不同形状尺寸的 region

4.2.3 region 物件

region 记载了影像中的特定区域数据,例如说影像中明亮的部分,region 对象中可含有一个 以上的区域数据,这些数据是彼此互相独立的,而且即使记载了某张影像的区域,这些数据 和影像本身并非直接相关。这种设计使得 region 的资料可以是任意形状尺寸,而且储存时非 常有效率。在内存中的 region 数据和影像灰阶数据是分离的,即使 region 有互相重迭时, 内存中的影像数组不会受到任何影响。

region 的纪录方式是由 runlength encording 演变而来的,称之为 chord encording,纪录的 是每一条弦(线)的起讫点数据,这种方式使得 region 数据占用极少的内存资源,而且在做 计算,尤其是型态学的计算有很好的效率。

region 既然没有尺寸的限制,因此它甚至于可以超过原始影像尺寸,这在应用上有其长处, 例如 region 中含有圆形特征物体,且要将边缘圆滑来去掉一些缺角或漏洞,例如用 closing_circle 做运算。另一个例子是去掉物体上的鳍状突出,(HDevelop 的例子 fin2.dev, 位于%HALCONROOT%\examples\hdevelop\Applications\FA),这是利用同一个圆形元素来 做边缘的扩张和收缩,圆半径250,这个半径似乎很大,但是对 HALCON 来说不是问题, 计算后的区域就把突出物去掉而变平滑。如果 region 被限制在影像大小的区域,扩张和收缩 两个步骤后的区域形状就无法去除突出物。





图例 利用 region 来做边缘处理

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

停止和取像设备的连结。同时会释放占用的系统资源。

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 时,是收到触发讯号 就开始取像,因此取像是依据某种条件进行的,而不是由程序下令。

大部分的 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 即可。

4.4 HALCON 的使用极限



影像尺寸 3276832768 内存中影像数组数目 100000 每个参数包含的对象数目 100000 每张影像的频道数 1000

tuple 中的数值数据数目 1000000 一条等值在线的取样点数目 30000 一个多边型上的控制点数目 10000 影像坐标 -32768 到 +32768 字符串长度 1024 个字符

第五章 使用 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 下存于

档案.halcon_par_info 中,置于$HALCONROOT 目录下。有些操作系统下,用户要有特定 的权限才能进行这个初始化的动作,否则 check_par_hw_potenial 在执行完后无法储存取得 的信息。例如在 Windows2000,必需要有 administrator 或是 group privilege 之''Power User'' 权限。UNIX 下的预设情况是安装 HALCON 的使用者才能新增或修改.halcon_par_info 这个 档案。必须注意的是,check_par_hw_potenial 在无法储存相关信息时不会传回错误讯息。 但是程序 hcheck_parallel 会先检查权限和写入限制,有问题时会先传回相关的错误讯息。





5.1.2 三种数据平行处理的层次

Parallel HALCON 利用数据分散的方式来使得运算符能够自动的进行平行处理,例如输入资 料的不同部分可被拆开分别独立处理,这种方式有三种层次。





tuple level

当某个运算符的参数中含有 tuple 形式的数据,则这些 tuple 中的对象或数据可以被分散到不 同的线程中做并行计算,但是这个做法有其条件限制,就是含有 tuple 数据的各个参数, tuple 中所含数据项的数目必须是一致的,或是都只含有一个。





channel level 当一个运算符的输入影像非单色影像,而是多频道影像,例如全彩影像或是多光谱的遥测影 像等等,不同的频道影像数据会被分散到不同的线程中做平行运算。不过其条件限制是所 有输入的影像其频道数目必须一致。





domain level

运算符计算时的 domain 也可以分成数个部分,分散到不同的线程同时计算。





在 HALCON 之 Reference Manual 里,每一个运算符的说明中都含有一项"Parallelization Information",说明了每一个运算符可以做到的平行化程度,也就是 tuple,channel,domain 等等。









5.2 使用 Parallel HALCON 的功能来撰写具并行计算能力的程序







Parallel HALCON 本身具有 thread-safe 以及 reentrant 的特性,例如不同的线程可以同时 呼叫同一个运算符而不必互相等待,不过并不是所有的运算符之 reentrant 的程度都一样。 这个章节介绍了 reentrancy 特性的相关说明,以及设计程序时的注意事项。范例程序为 example_multithread1.c。

5.2.1 关于 reentrancy 的进一步说明

Reenrancy 也有不同的层次,说明如下。





reenrant

这个层次的运算符可由不同的线程同时呼叫,而且与其使用的 data 互相独立,不会因为资 料而影响其独立运作的特性。





local

这个层次只在 Windows NT/2000/XP 下有意义。

属于 local 层次的运算符必须要由主线程(主程序)呼叫,而不能由其他线程叫用,最典型 的例子是有关图形以及 IO 控制的运算符,这是因为在 Windows 系统下,线程与图型接口 之间有直接的对应关系,例如窗口,对话框,按钮等等,也就是每个图形显示接口都有个别 的线程在控制,如果某个线程要对另一个线程所对应的图形接口像是窗口等等做修 改,系统会因此打结。例如,您在某个线程中用 open_window 开了一个窗口,却在另一 个线程中用 draw_circle 在这个窗口中画圆型。 有些运算符并非完全以图形元素为参数或是与其相关,但是在某些情况下却会处理到图形介 面等等,这一类的运算符都被归类于 local,事实上在主线程以外还是可以另行叫用,只是 有可能会遇到问题。









single write muliple read 某些运算符只有在不同的线程分别处理不同的数据时,也就是数据不重迭时,才能同时叫 用。例如做 pattern matching 时所用的 template,要用 adapt_template 对它作修改时,不同 的线程若是对同一个 template 做处理,就会出问题。此外,当某个线程在读取某个数据 时,就不应该用另一个线程同时企图修改该项数据。另外一组有类似操作限制的运算符是 和档案 IO 有关的,例如 write_image,read_image,fwrite_string,fread_string 等等,其实 即使不是 HALCON 提供的功能,也有类似的限制。另外一个例子是 update_bg_esti 或是 give_bg_esti。这类运算的多线程通常并不建议使用,所以 HALCON 也不会主动的去做限 制,但是当您无意间用不同的线程去处理相同的 data 时,可能会得到不可预期的结果。





mutual exclusive 某些运算符本身不能同时由多个线程重复叫用,但是可以和其他的运算符同时执行,例如 combine_road_xld,concat_ocr_trainf。





completely exclusive

这一类的运算符执行时,就不能同时执行任何其他的运算符,像是和 OCR/OCV 有关,修改 OCR classificaion 的运算符,增删档案,或是 reser_obj_db。此外,设计人员必须确认的是, 要执行 reset_obj_db 前,必须先确认所有先前执行的运算符及其线程都已执行完毕。

5.2.2 Style Guide





Initialization

在一个多线程的程序中,要执行运算符前,要先呼叫一个运算符让 HALCON 做内部结构 上的初始化。建议的运算符是 reset_obj_db。





I/O

在 WindowsNT/2000/XP 下,和 IO 有关的运算符像是 open_window 或是 disp_image 等等, 只能由主线程呼叫,在 Reference Manual 中,这就是所谓 locally reentrant,如 5.2.1 所叙述。只要有档案增删等等动作,其他的线程就必须等待。





Multithreading 以及 Automatic Parallelzation 在一个多处理器计算机上执行的多线程程序,最好是将自动平行化机制关闭,这样可以求得 较好的效率。









5.3 附加信息





5.3.1 如何将 Reentrancy 或是自动平行化机制关闭

透过 set_system,您可以将 HALCON 的部分功能关闭,例如自动平行化机制





set_system(''parallelize_operators'',''false'') 关闭 reentrancy set_system(''reentrant'',''false'')



要恢复功能,用同样的运算符,第二个参数改成''true''即可。要注意的是,如果关闭了 reentrancy,就同时也关闭了 automatic parallelization。关闭这些功能的前提是您确定不会 用到,并且要以此省下过度的分散计算造成的时间浪费。

关闭平行化机制的理由之一是为了 debugging,或是您的程序对线程自有安排,不希望受 到自动机制的干扰。当然,如果您在单处理器的计算机上执行 Parallel HALCON,HALCON 就 不会做任何调整动作,所以您也没必要将这个机制关闭。

5.3.2 在 Parallel HALCON 中使用取像系统

标准版 HALCON 支持的取像器,在 Parallel HALCON 中都可以使用,不过所有的取像器运 算子都不会被做平行化的处理,大部分的运算符都是''reentrant'',但是和取像器直接连结的, 都是''completely exclusively''例如 open_framegrabber,info_framegrabber, close_framegrabber,close_all_framegrabber 等等。

属于''local''层次的运算符在 Windows NT/2000/XP 下只能由主线程呼叫。

在 Windows NT/2000/XP 下,每个取像接口都包含了两个 DLL 檔,一个是给标准版 HALCON 使用的,以 HFG 为档名开头,另一个是给 Parallel HALCON 使用的,以 parHFG 为档名开 头,这两种版本的 HALCON 会自动的加载对应的 DLL 檔。

在 UNIX 下,这两种版本的 HALCON 都是用同一个 shared library。









5.3.3 Extension Package 以及 Parallel HALCON

Extension Package 若要在 Parallel HALCON 中使用,就要另行提供一个以 par 为档名起始 的 library,例如在 Windows NT/2000/XP 下,某个名为 halconuser 的 package,Parallel HALCON 会去寻找名为 parhalconuser.dll 的 library。相对的,在 UNIX 下,就是 libparhalconuser.so。







5.3.4 Parallel HALCON 以及 HALCON Spy

HALCON Spy 不能用于监视 Parallel HALCON。

第六章 疑难解答







6.1 如何取得 HALCON 的最新消息



在您使用 HDevelop 时,从选单之 Help>HALCON News (WWW)即可启动您预设的浏览器连 结到 MVTec 的网站,在这里可以找到新的 extension package,取像接口,以及 HALCON 的最新版本等等信息。





6.2 在 Windows NT/2000/XP 下的建议事项



在 Windows NT/2000/XP 下,用户接口中视觉效果的设定会影响系统速度,建议将其关闭。 由桌面上右键单击,由''内容''中的''效果'',将选项关闭即可。





6.3 HDevelop 的联机帮助



HDevelop 提供了相当广泛的说明,如下列。





System suggestions

系统由 operator knowledge base 为基础提供选择运算符 的建议,这里就提供了选择合理的 predecessors 以及 successors 的建议。如果要试着使用不同的图像处理方法,可以由 altinatives 以及 reference 来找寻可用的运算符。如果您只记得运算符名字的一部份,您可以 只输入这些关键词,系统就会把所有名称符合的运算符都列出来供您挑选。





Online help on operators

HALCON 对所有的 HDevelop 运算符提供了详细的联机帮助,这些说明按照的一定的结构 排列,让您易于查阅及了解这些运算符的内容。此外还有 cross reference,可以迅速的查阅 相关的运算符。以上这些说明文件只要用 HTML 的浏览器即可阅读。





Debugging help 您可以用数种模式来执行程序,可以以程序代码一行行为单位,一步一步执行,也可以设定中 断点,当然也可以一次连续的执行到底。为了对 debugging 提供有效的支持,环境变量 HALCONSPY 必须予以设定,这部分请参考 2.4.2 节的说明。





Result Visualization

HDevelop 的接口设计让您可以立刻看到运算符计算后的结果,这种可视化的功能使您可以 在最短的时间里找到计算的问题,例如参数的值。此外,输出接口也可以修改,让您可以用 最容易明了的方式展现结果。

6.4 用 HALCON Spy 来监看程序的执行







使用 HALCON Spy,可以监看运算符的数入输出变量数据,并以图形或文字的方式表示,方 便您进行 debug。

在 HALCON 的程序中,用运算符 set_spy 即可启用 HALCON Spy。





set_apy(''mode'',''on'')





除了这个方法以外,在一个 Link 好的程序中要使用 HLACON Spy,只要将环境变量

%HALCONSPY%设好即可。设定方法请参考 2.4 节。 监看的模式可以由 set_spy 设定,例如下列。





set_spy(''operator'',''on'')

set_spy(''input_control'',''on'')





如此一来,所有叫用的运算符名称以及输入输出的变量都会显示。显示模式也可以由环境变 数中设定,在 Windows NT/2000/XP 下,可将环境变量%HALCONSPY%的值设为





operator=on;input_control=on





这样的设定结果就和先前用 set_spy 的例子是一样的。在 UNIX 下,两个变量之间要用'':''冒号 分隔。





6.5 疑难解答



这里说明在安装,卸载,使用 HDevelop 以及 Parallel HALCON 时遇到的错误讯息以及 排除方法。





6.5.1 安装时的问题





Registration of halconx.dll failed

在某些系统上,可能会遇到 HALCON/COM 的 library halconx.dll 发生无法完成 self-register

的警告。可能的原因之一是 Microsoft 本身的 atl.dll 在 register 时出问题(这个 library 位于

%SystemRoot%\system32 下,例如 C:\WINNT\sysem32),要将这个 library 完成注册,请 依下列程序执行。





开启一个 DOS 窗口,将目录切换到 CD 上的 misc\i586-nt4,然后执行注册程序。

>E:

>cd misc\i586-nt4

>reg-halconx atl.dll

>reg-halconx





安装以及卸载 license manager daemon

万一使用 floating license 所需要的 FlEXlm license daemon 没有装好,就要以手动方式另行 安装。开启一个 DOS 窗口,输入下列指令。(注意,这是一整串指令)

"%HALCONROOT%\FLEXlm\i586-nt4\installs" -n "HALCON License"

-c "%HALCONROOT%\license\license.dat"

-l "%HALCONROOT%\license\license.log"

-e "%HALCONROOT%\FLEXlm\i586-nt4\lmgrd.exe"





安装成功以后,在 控制面板>系统管理工具>服务 中,就会看到一个名为"HALCON License"

的 service。

要解除这个 daemon,指令如下列。





"%HALCONROOT%\FLEXlm\i586-nt4\installs" -r -n "HALCON License"





6.5.2 卸载时遇到的问题





Unregistration of halconx.dll

如果您在先前用手动方式 register HALCON/COM 接口的 halconx.dll,而现在要将

HALCON 卸载时,必须以手动方式先将 halconx.dll 做 unregister。

开启一个 DOS 窗口,将目录切换到 CD 上的 misc\i586-nt4,然后执行注册程序。

>E:

>cd misc\i586-nt4

>reg-halconx /u





移除 license manager daemon

如同 2.2.1 节所叙的,要移除使用 float license 的 HALCON 5.0 或 5.1 版时,有时会遇到 FlEXlm license daemon 没有移除完全。要将其移除,请在进行 uninstall 前,以如下的手动 方式进行。开启一个 DOS 窗口,输入





"%HALCONROOT%\FLEXlm\i586-nt4\installs" -r -n "HALCON License"





由于在 DOS 命令提示模式下输入的路径名称中不能含有空格,所以如果您将 HALCON 装在 像是下列的目录,



c:\Pregram Files\MVTec\Halcon





在输入时就必须改成(这是一整行)

c:\Progra~1\MVTec\Halcon\FLEXlm\i586-nt4\installs -r -n "HALCON License"





否则就以下列的输入方式(这是一整行)

"c:\Program Files\MVTec\Halcon\FLEXlm\i586-nt4\installs"-r -n "HALCON License"





当然也可以先切换到程序所在的目录





cd "%HALCONROOT%\FLEXlm\i586-nt4"





再执行程序来解除登录





installs -r -n "HALCON License"







关于 Internal Error





若是在卸载的过程中遇到下列的讯息



"Inter Error,unable to load or call external DLL.Please contact your distributor for more information"

最有可能的原因是安装新版时,未先将旧版的东西完全移除,另一个可能的原因是

安装时的目录有所更动,或是环境变量%HALCONROOT%经过手动修改。 遇到这类的情况请依下列步骤来排除问题。





1.检查环境变量%HALCONROOT%的内容,看看是不是和您安装 HALCON 的目录相符。 检查的方法是由 我的计算机>控制面板>系统>进阶>环境变量 来查看,或是在 DOS 命令提示符 号下,键入 echo %HALCONROOT% ,也可以查看变量内容。如果变量内容是空的或是 其中的路径内容并非您安装 HALCON 的目录,必须再从控制面板中以手动方式去修改。

2.检查下列两个档案在不在 在%HALCONROOT%下, Unins.isu

在%HALCONROOT%\FLEXlm\i586-nt4\下, HalconUninst.dll





Uninst.isu 这个档案在安装时就会自动产生,如果没有这个档案,就无法进行自动的解除安

装,HalconUninst.dll 是专为 HALCON 卸载而设计的,如果不见了,可以从 HALCON

的 CD 上复制一份,档案位于 FLEXlm\i586-nt4\下。





3.检查 Windows 登录档中关于 Uninstaller 的设定。 启动登录文件的编辑程序 regedit,找到下列登录项目,





HKEY_LOCAL_MACHINE->SOFTWARE->Microsoft->Windows-> CurrentVersion->Uninstall->Halcon

这里的即是您想要移除的 Halcon 版本名称(或是不在计算机中的),另外还

有一个机码名称为 ''UninstallString'',其字符串内容应该有如下列(或类似),





c:\WINNT\IsUninst.exe -f"c:\Program Files\MVTec\Halcon\Uninst.isu"

-c"c:\Program Files\MVTec\Halcon\FLEXlm\i586-nt4\HalconUninst.dll"





当然要确定 c:\Program Files\MVTec\Halcon\是实际的安装路径,同时和环境变量

%HALCONROOT%是一致的。要注意的是当路径中含有空格,像是 Program Files 之类的, 此时就要将整个路径用引号'' " ''括起来。如果您发现路径之中含有空格而没有用引号,请自行 加上。





4.最后,关闭 regedit,重新再试一次 uninstall。









遇到 uninstallation failed

若是遇到卸载无法自动进行,则以下列手动方式进行。

1.使用 floating license 版本的,先以下列指令将 license manager service 关闭。





"%HALCONROOT%\FLEXlm\i586-nt4\installs" -r -n "HALCON License"





2.用 regedit 将下列机码删除

HKEY_LOCAL_MACHINE->SOFTWARE->Microsoft->Windows-> CurrentVersion->Uninstall->Halcon

以及



HKEY_LOCAL_MACHINE->SOFTWARE->MVTec





3.用文件管理器,删除下列目录

%SystemRoot%\Profiles\All Users\start Menu\Programs\Halcon

通常%SystemRoot%是 c:\winnt

4.最后,删除 Halcon 的安装目录 %HALCONROOT%















6.5.3 和 license 有关的问题





如果您遇到和 license 有关的问题,像是 license file 的位置无误,但是却出了问题,首先要 先确定计算机或 dongle 的辨识数据(请看 2.3.1 节)和 license file 所载内容是否一致(请看 2.3.3 节)。如果这两者不相符,请送一份新的辨识数据到代理商,如果在取得辨识数据方面出问题, 请看以下的说明。

floating license 的使用者,请参考 2.3.4 节,尤其是选择适合的 port 供 license manager daemon 的部分。

dongle 的使用者,若您的 HALCON 版本是 6.0.2 版或更新的,遇到"license not found"的讯 息,则建议您依照 2.3.5.1 节的方法将旧的 dongle driver 移除,再安装新的驱动程序。





6.5.3.1 取得辨识资料上的问题





HDevelop 没有显示任何 host ID

如果您的计算机有网络卡,有 dongle,使用 Pentium III,却没有取得任何 host ID 数据,则请 用 2.3.1.2 节的方法来取得。





网络未使用时即无法取得 licensing

在 Windows 2000 及 XP 下,如果您的网络卡并未和网络相连,必须将 Media sense(DHCP)

关闭,通常这种情况只要将 DHCP 关闭即可,这方面问题的详细说明可以参考微软公司网站

http://support.microsoft.com/support/kb/articles/q239/9/24.asp.





lmhostid -ether 传回 "ffffffff"或"0" 通常这个情况代表您的计算机上没有网络卡,如果网络卡确实已经装了,Windows2000/XP 的 使用者请检查 client for Microsoft network 是否有安装。可由"网络芳邻"右键单击选择内容,选 "区域联机"之内容,看看是不是有这个通讯协议。如果没有,请将其安装。 安装完成后再依照 2.3.1.1 或是 2.3.1.2 的方法尝试。

在 NT 下,请检查 NetBEUI 或是 TCP/IP 是否有安装。





一张网络卡却有好几个 ID

在 Windows2000/XP 下有时会遇到这种情况,这种情形下选择的方式是重新启动后依然不变 的,或是将 NetBEUI 以及 IPX/SPX 关闭后仍然存在的。

lmhostid -cpu64 传回 ""

如果 lmhostid 传回的数据像是下面的东西,





>lmhostid -cpu64

lmhostid - Copyright (C)1989-2000 Globetrotter Software,Inc

The FLEXlm host ID of this machine is ""

lmhostid:FLEXlm function not available in this version <-45,520>





这代表您计算机的处理器没有提供 CPU ID。通常这是像 2.3.1.2 节所说的,在 BIOS 中的设定 关闭了,只要在 BIOS 的设定中将其开启即可。





lmhostid -flexid 无法传回 dongle ID

若是 lmhostid 无法传回印在 dongle 背后的 ID,请用 2.3.5 节的方法检查驱动程序是否装好。 如果驱动程序确实装好了,请检查您的计算机 USB 或是 parallel port 是不是有问题。





6.5.4 关于 HDevelop 的问题

这里提出一些执行 HDevelop 时遇到的一些错误讯息,发生的原因,以及其解决方法。









No license found

造成这种问题有几个可能原因

%HALCONROOT%\license\license.dat 这个档案不见了或是无法读取。 这个 license 不是用于这台计算机

在 floating license 使用者遇到的,可能是在线使用者过多。





lost connection to license server

首先先确定 license server 是否有在运作。另外也检查您的计算机是不是有和 server 相连,这 方面的问题可能要由系统管理员处理。





No license for this operator

这表示您目前的 license 并未包含对这个运算符的用户许可证。请重新取得一个包含这个模块 的 license。





Wrong architecture

您的计算机硬件并不适用安装的 HALCON 版本,或是和环境变量 ARCHITECTURE 不相符。 请检查 ARCHITECTURE 的内容或是重新安装 HALCON。





hdevelop:Command not found

请检查您的环境变量 PATH,它必须包含下列路径$HALCONROOT/bin/$ARCHITECTURE





lib:can''t open file

这是属于 UNIX 系统下的问题,请检查系统变量 LD_LIBRARY_PATH(参考 2.4.2 节)





No help file for package in directory <路径>

可能原因是

%HALCONROOT%\help\下没有对应的 help 檔

HALCONROOT 有问题

检查档案读写保护,有可能 HDevelop 没有读取某些档案的权限。





Help file for packageis corrupt

如果 package 名称是 system,可能是 HALCONROOT 有问题,或是%HALCONROOT%\help\

下的档案版本不符。

如果 package 名称是使用者自定义的,则可能是因为 help 檔的版本不符。





Can''t open display

这类错误通常是因为系统变量 DISPLAY 的问题,或是程序不能在 X-server 下开启窗口。















6.5.5 使用 Pararllel HALCON 的问题

Parallel HALCON 未能提高指令周期

如果在一个多处理器的计算机上 HALCON 未能提高指令周期,则可能是因为您忘了做初始化。 这方面请参考 5.1.1 节。在每一台执行 Parallel HALCON 的计算机上,都要做一次初始化的动 作。如果已完成初始化的动作,可以由运算符 get_system,参数设为 processor_num,来 查看 HALCON 在这台计算机上发现了几个处理器。这个运算符要在 Parallel HALCON 下来执 行才有意义。





在 Visual Studio 下使用 Parallel HALCON 会比预期的速度还慢

Microsoft 的 Visual Studio 在多处理器的计算机中执行时会对线程的排程有重大影响。 HALCON 和 Visual Studio 一起使用时会被拖慢,因此要得到最好的效率,最好是产生一个 独立的执行档,并且单独执行。





某个运算符在 HALCON 和 Parallel HALCON 下的传回结果不一样 这可能是因为您的参数中含有 tuple 型态的参数。注意,某些参数不能是 tuple 型态的数据, 甚至于有些运算符不会传回错误讯息。这些参数的限制可以在联机帮助或参考手册中找到,

可以使用 tuple 型态的参数,会有''(-array)''的标示。









6.5.6 其他问题

在一些 UNIX 系统下默认的窗口特性,像是重迭或是覆盖时窗口数据的显示等等,会造成 HALCON 使用上的不便。例如被遮盖的窗口,它的内容就不会保留,上层窗口移动时,被盖 住的部分就变成黑色。例如 Linux 的 SuSe 7.0 版。修改的方法是调整窗口的属性,它的名 称是 backing-store。

可以输入下列指令来查看目前设定





xdpyinfo | grep backing-store





得到类似下列的响应





options: backing-store YES,save-unders YES





此外还可以修改 Xservers 这个档案。它位于/usr/lib/X11/xdm(或是类似的目录)下,不过您要 有 root 的权限来修改它。在内容中加入 "+bs"(就是加入 backing-store 的意思)





:0 local /usr/X11R6/bin/X :0 vt7 +bs





然后中止 X Server 运作,再重新启动(或是重新启动也可以),此时 xdpyinfo 的传回结果 应该就和上述相符。







































1







献花(0)
+1
(本文系shouhuyanya...首藏)