本站所列毕业设计(论文)资料均属于原创者所有,初衷是为大家在毕业设计(论文)过程中参考和学习交流之用。

毕业设计我帮你

HALCON.机器视觉的力量

www.bysj580.com / 2023-02-17
HALCON.机器视觉的力量
介绍
 
HALCON  可扩展多达 99  个额外的操作员包。在初始化 sys-tem  期间, 自动加载环 境变量 HALCONSs  指示的所有包。包通常包含包含新运算符的库、其原型、HDD  所需 的操作员信息以及 HTML  在线文档。对于此类包的编程,使用 HALCON  扩展包接口, 例如,操作 HALCON  运算符的参数,并从具有标志性对象的 HALCON  数据库中读取或 写入标志性数据 (图像、区域、XlDs 1)。
此外,HALCON  本身提供的运算符也基于扩展包接口的功能。因此,扩展包接口既 是应用程序与 HALCON 系统操作层之间的接口,也是操作层与标志性对象数据库之间的 接口。
使用扩展包接口扩展 HALCON  功能的原因可能是以下原因之一:
•  扩展图像处理操作员池,
•  集成特殊图像处理硬件,
•  集成特殊的图形软件包。
用户通过包含其自己的运算符的包扩展 HALCON  后,可以在所有支持的主机语言和 交互式工具 H 开发中使用。
本章简要介绍了 HALCON  包和运算符,包括描述简单运算符集成的示例。以下各章 提供了详细信息,允许您编写自己的软件包。作为常见示例,将使用名为 halconuser  的包。
除了 UNIX  中的特定部分,本手册文件路径和环境变量在 Windows  约定中打印,例
如,表示包含环境变量 HALCONROOT  引用的 HALCON  基本目录中的示例包的子目录 halconuser。
 
1.HALCON  操作员
本节介绍 HALCON  运算符的外部接口,即如何在编程语言中使用它们及其内部结构。
1. 1  使用 C 、C++  和 .NET  语言中的 HALCON  运算符
从 HALCON/C  调用运算符有两种不同的模式:一种方法是调用每个控制参数只有一 个值的简单应用程序 (简单模式) 的运算符。对于许多应用程序来说,这是最简单的方法, 也足够了。当使用需要每个参数多个值的复杂过程时,数据将在元数  (Htuple )  中传输。 图标对象使用 Hobject  对象类型表示,以便一个对象可以包含多个图像、区域或 XlD。相 反,HALCON/C++  和 HALCON/.NET  接口支持多种类型的灵活管理。
但是,定义的类层次结构在 HALCON  运算符和提供的类之间具有固定映射。此映射 遵循预定义的规则,因此部分是泛型的。用户定义的 HALCON  运算符不能链接到类层次 结构中的任意位置。因此,这些运算符使用泛型数据类型 Hobject  进行集成,以便将参数 传递给运算符。如果将 H 开发程序导出为 C#  或 C#代码,也会使用此类集成。
1.2 HALCON 操作员的内部结构
 
HALCON  运算符 (如 halconuser  中的新运算符) 通常由两个过程组成:一个过程供 应过程-接收输入数据,测试其一致性,将其传递到处理操作过程,并在处理后返回输出数 据。如果输入数据包含任何组合的标志性对象 (例如图像元数) ,则供应过程必须提取单 个部分。图标对象键可以表示无限数量的标志性对象,每个图像对象可能由多个组件 ( 一 个区域和无限数量的灰色值通道) 组成。通常,用户可能假定 HALCON  运算符能够处理 单个标志性对象以及组合对象 (即多值设置为可选) ,并且它可以处理多通道图像 (即多 通道设置为可选) 。因此,新 HALCON  运算符的作者应实施适当的机制, 以便在供应过 程中从组合的标志性对象(或多通道图像)中提取所需的数据。此过程的名称指定在 def 文 件中指定的内部 C  过程名称。
预处理输入数据后,在电源过程中调用操作过程。此过程执行特定图像处理。在大多 数情况下,操作过程仅接收已提取的单个组件 (例如,Hrlregion  类型的区域、Himage  类 型的通道或指向原始图像数据的指针) 和参数值。结果将返回到电源过程,其中它们被传 递到生成的接口,这些接口将结果返回到调用系统。每个电源过程都返回 Herror  类型的 错误代码。因此,有必要返回一个错误代码,这是 H_MSG_TRUE 如果发生错误。
只有一个参数 (所谓的过程句柄) 传递给电源过程。所有其他输入数据 (图标对象和 控制值)都在此标识符的帮助下读取和写入。此外,它允许在并行硬件上运行 HALCON  时 唯一识别 HALCON  操作员呼叫。而不是进一步的参数,所有输入和输出的电源过程是在 几个 (内部) 缓冲区的帮助下完成的。
缓冲区包含输入数据和输出数据。控制参数 (包含所有类型的控制值 (如整数、浮点 值或字符串) 直接存储在缓冲区中,而所有标志性数据 (包括图像、区域和 XlD) 都存储 在数据库中,并由图标对象键表示。使用这些键,可以在数据库过程的帮助下访问图标数 据。扩展包接口为在电源过程中读取和写入参数缓冲区的元素提供了特殊过程和宏。每个 参数都属于四个类之一:
•  输入标志性对象
•  输出标志性对象
•  输入控制参数
•  输出控制参数
确定适当过程/宏的名称 (例如:使用 HGetCPar  获取输入控制值) 。要标识类中的特 定参数,其编号将传递给过程/宏。这是每个参数类的 HALCON  运算符参数列表中的参数 数 (例如:要获取第二个输入控制参数的值,必须将数字 2  传递给 HGetCPar)。
缓冲区上的读/写访问由生成的接口自动完成。此接口的代码由 HALCON  编译器 hcomp  从所谓的定义文件 (def-file )  生成。新的 HALCON  运算符的任何程序员都必须 提供这样的定义文件,其中包含所有相关信息,例如,有关输入参数和输出参数的信息: 有关参数类 (输入/输出、图标对象/控件)、参数类型等信息。解释了定义文件的语法和语 义。
2.HALCON  软件包
与标准 HALCON  系统类似,程序员必须提供 (至少) 两个库 (Windows  中的 DLL、 UNIX  环境中的共享库),以便通过新的运算符包来扩展 HALCON:
•  包含新运算符的库 (用 C  编写) 。本手册的大部分是关于如何根据 HALCON  系 统的内部数据结构/过程编写此类运算符。此库的名称与包本身的名称相同,在我 们的示例中为 halconuser。
•  封装生成的接口代码的库 (对于 C 、C++ 、.NET) 。这些库 (即操作器库和接口库 之一) 必须在新应用程序中使用,以便提供新运算符与您选择的主机语言的接口。 有关这些库的大部分工作由 HALCON  编译器 hcomp  完成。有关详细信息在示例
 
包中,这些库称为 halconuserc 、halconusercpp 和 halconuserdotnet。
所有这些库的名称都派生自包本身的名称:包包包含库 2  包、包 c、包 cpp  和包 dotnet。
 
2. 1  包装和 HALCON XL
扩展包也可用于 HALCON XL 。与 HALCON  库类似,它们存在于两个版本 (例如, halcon. dll  和 halconxl. dll) 中,您必须提供单独的包库版本, 以便与 HALCON XL  一起 使用。这些库的名称必须具有后缀 xl;例如,示例包 halconuser  的 HALCON XL  版本由 库 halconuserxl  组成。dll ,  哈康塞克克斯.dll ,  哈尔康塞普克斯克斯.dll ,和哈康塞 xxl。 dll    (窗口),  利哈尔康瑟克斯.所以,利哈尔科瑟克克斯克斯。所以,和利哈尔康塞普普 克斯克斯。所以 (UNIX) 和半孔多特特克斯。dll    ( .NET)。
库的 HALCON XL  版本创建与标准 HALCON  版本类似,仅具有很小的差异。
 
2.2 HALCON  包的目录结构
HALCON   包 驻 留 在 与 包 本 身 同 名 的 目 录 中 。  在 我 们 的 示 例 中 ,  这 是 %HALCONEXAMPLE%\c_interface  中的目录 halconuser。此目录必须至少包含以下子 目录:
• bin\HALCONARCH%:对于 Windows,此子目录必须包含 DLL  包。dll,包克 dll  和 包 cpp 。dll ,对应于上述库 (及其 HALCON XL  版本) 。我们还建议在此子目录中 放置已编译的示例程序或包的其他实用程序。
• lib\%HALCONARCH% :在此子目录中,封装新运算符 (包) 和相应的 C 、C++  和 COM  语言接口 (包 c 、包 cpp 、包 x ) 的库与其 HALCON XL  版本一起驻留。请 注意,不应更改这些库的名称及其在包中的位置。否则,HALCON  系统无法加载 包 。 环 境 变 量 HALCONARCH  在 HALCON  安 装 过 程 中 设置 , 它 描 述 了 HALCON  正在运行的平台。
• bin\dotnet :此子目录必须包含扩展包的 .NET  程序集包   -dotnet 。dll  (及其 HALCON XL 版本,包多特内克斯.dll)。
•  帮助:此子目录包含包含联机访问知识库的数据的文件。它们必须生成并放置在此 目录中, 以便使用 HDevelop  开发中的包。如果没有这些文件,HDevelop 开发无 法检索访问包运算符所需的信息。
 
我们还建议提供其他子目录:
•  定义:在此目录中,应放置具有包运算符说明的 def 文件。
•  包括:在此目录中,应放置生成的包含包运算符原型的文件。
•  文档:在此目录中应放置包的文档(另请参阅 %HALCON-ROOT%\doc  进行比较)。 尤其有必要将生成的 HTML  文件放入文档html 引用中,以便从 HDevelop 开发 操作窗口获得在线帮助。
•  示例:此目录可能包含一些典型的示例程序 (例如,HDev  发展开发文件) ,这些 程序演示了新运算符的使用。
•  图像:如果提供的示例需要特定图像,则应将其放置在此目录中。在这种情况下, 我们建议在环境变量 HALCONIMAGES  中包括此子目录的路径,以便允许访问这 些图像,而无需在程序中使用绝对文件路径。
 
2.3  如何创建和使用 HALCON  包
总之,创建 HALCON  包时需要以下步骤,该包的名称包将新运算符集成到 HALCON 系统中。如 中所述,要创建 HALCON XL  包,必须创建库的第二个版本。有关这些步骤
 
的详细说明,请参阅本手册的参考部分:
1.  一个或多个 def 文件中的新运算符的说明 。我们建议将这些文件放在包子目录 def  中。
2.  创建包含 C  中的供应程序和相应操作程序的库 (称为包) 。此库必须放置在包子 目录库库%HALCONARCH%    (UNIX)  或 bin\%HALCONARCH%    (Windows ) 中。
3.在 hcomp  的帮助下,基于 def 文件创建包含语言相关运算符接口 (包 c 、包 cpp、 包 x 和包 dotnet) 的库。这些库必须放置在子目录库库 (UnIX  下的 C 、C#) 或 bin\%HALCONARCH%  (Windows  下的 C 、C++) 或包的 bin\dotnet  中。
4.生成文件,在 hcomp 的帮助下在线访问知识库。这些文件被使用,例如, 由 H 开 发。它们必须放置在包的子目录帮助中。
5.  借助 hcomp  (可选) 生成 HTML  参考文件。生成的文件必 须放在包的子目录文档html 引用中。
6.  在 hcomp  的帮助下生成 PDF  手册 (可选)。
7.  通过新包的完整文件路径扩展环境变量 HALCONCONS  中的包列表,例如,对于 某些平台,必须修改其他环境变量。
8.将生成的库与 HALCON 库链接到图像分析应用程序。为此,您必须修改其他环境 变量,具体取决于操作系统 (见下文) 。请注意,H 发展能够动态访问新的运算符, 而无需链接。
 
 
3.安装 HALCON  软件包
 
为了安装 HALCON  包,您必须将包复制到硬盘,并将包的完整路径添加到环境变量 HALCONCONS ,例如,请注意,环境变量中的路径之间的分隔符是 Windows  系统上的 分号和 UNIX  系统上的冒号。
切勿更改包的名称或包中包含的库或 DLL  的相应名称。
这些名称在库/DLL  中编码。如果更改名称,此信息将不再匹配。因此,操作系统的 加载程序将无法打开动态库。为了在 HDevelop 开发中使用新包,您必须重新启动该程序。 要使用包生成独立应用程序,必须链接 C  或 C++  接口库,或在应用程序代码中引用包 的 .NET  程序集。
如 果 包 包 含 使 用 的 图 像 , 例 如 , 在 示 例 程 序 中 , 您 可 能 希 望 在 环 境 变 量 HALCONIMAGES  中包括 cor  响应目录 (例如,包中的图像),以访问这些图像,而无需 指定完整的路径。
此外,您必须修改其他环境变量才能使用新包。
3. 1 Windows  的其他信息
为了能够将包 DLL  链接到应用程序,必须将新包的完整 DLL  文件路径 (例如) 添 加到环境变量 PATH  中。
不要将包 DLL  复制到 Windows  系统目录中,因为在这种情况下,它将加载两次!
请注意,即使未显式链接主包库(包.dll),也还必须扩展 .NET  应用程序的变量 PATH: 引用的 .NET  程序集会自动加载此库。
3.2 Linux  的其他信息
在运行 Linux  的 UNIX PC  上,您必须在环境变量 LD_LIBRARY_PATH 中包括包库
 
子目录$HALCONARCH 才能使用包。
在任何情况下,都必须这样做 ,无论您是计划仅在 H 开发中使用包,还是要创建独 立应用程序。
对于 .NET  应用程序,在程序员指南中介绍了设置 LD_LIBRARY_PATH 的替代方法。
3.3 Solaris  的附加信息
在运行 Solaris  的 UNIX  工作站上,您必须将包库子目录库/$HALCONARCH 添加到 环境变量 LD_LIBRARY_PATH 才能基于包运行独立应用程序。否则,加载程序将无法访 问接口库 libpackagec 。因此或 libpackagecpp 。因此链接到应用程序。
请注意,即使未显式链接主包库 (包.所以): 引用的 .NET  程序集自动加载此库,也 必须为 .NET  应用程序扩展变量 LD_LIBRARY_PATH 。LD_LIBRARY_PATH 设置的替代 方法在程序员指南中描述。
请注意,无需修改 LD_LIBRARY_PATH 才能在 HDevelop 开发中使用包。
 
 
4.An 示例
下面的示例演示了描述的步骤。假设,要实现名为 user_thresh  的新运算符, 以提取 灰色值大于输入参数中指定的阈值的所有像素。图 1  说明了 C  程序中 user_thresh 的使用; 提       供        了       更       详       细        的       示       例 在 %HALCONEXAMPLES%_extension_package_halconuser_source_test 阈值中。
main()
{
HobjectImage,Region;
int Thresh;
read_image(&Image,"monkey");
Thresh=100;
user_thresh(Image,&Region,Thresh);
}
图 1 :以 C  表示 user_thresh 调用运算符
在 C  程序 4  中以这种方式使用 user_thresh:
•  必须实施新运算符。
•  必须生成相应的 HALCON  接口代码。
•  必须创建相应的包,特别是包含运算符和接口库。
•  应用程序必须链接。
user_thresh<- CIPUserThreshold[Image:Region:Threshold$i:];
图 2 :定义新运算符 user_thresh
首先,必须创建一个定义文件 (文件扩展名.def) ,如图 2  和图 3  所示。图 2  仅显 示定义文件为了在 C  程序中调用新运算符而必须包含的绝对最小信息。使用 H  开发、 C#  或 C#  时,需要扩展版本,如 所述。图 3 说明了这种扩展定义的最小形式。定义文件
 
指定:
•  操作员的姓名  (user_thresh),
•  必须在 C    (CIPUser  阈值)  中实施的供应程序的名称,
•  运算符参数的名称和类型。参数的名称仅对手册和 H 开发中很重要。
扩展运算符def-file 的最小形式包括:简短描述 (简短) 、操作者所属的 HALCON 模 块 (模块)、手册的章节 (章节) 的映射、到标志性对象 (功能) 的映射, 以及每个参数 的语义类型 ( sem_type) 。此外,必须为控制参数指定类型 (default_type) 和数字 (多值)。
我们的操作员 user_thresh 得到了以下参数:
•  一个输入图标对象参数 (图像),
•  一个输出图标对象参数 (区域),
•  一个输入控制参数 (阈值) 的类型int ,正好一个值
•  无输出控制参数。
现在,hcomp  使用 def  文件中的运算符定义来生成适当的接口代码。 图 4  显示了 hcomp  的调用。请注意,在本手册中,halconuser  用作要创建的 HALCON  包的名称。通 过调用 hcomp 与这些选项 5 的文件 Hhalconuser.c    (HALCON  接口代码),HChalconuser。 c    (特定于 C  的接口代码) 和 HChalconuser.h  (新的 HALCON  运算符的原型) 被创建。 在下一步中,必须对新的 HALCON  运算符进行编程。这是通过实现供应和行动程序。
这导致 HALCON 运算符的典型结构,如图5 所示。
user_thresh<- CIPUserThreshold[Image:Region:Threshold:]
short.german
Schwellwertoperator.;
short. english
Selection of grayvalues bythresholding.;
module
foundation;
chapter.german
BenutzerErweiterungen;
 
 
functionality
mage;
 
parameter
Image:input_object;
sem_type:image;
parameter
Region:output_object;
 
sem_type:region;
parameter
Threshold:input_control;
 
图  3 :  运 算 符 的 扩 展  def   文 件 user_thresh   ( 最 小 形 式 )  的 示 例 ,  参 见%HALCONS%\extension_package\halconuser\def\threshold.def。
hcomp -u -H -phalconuser threshold. def
hcomp -u -C -phalconuser threshold. Def
图 4 :HALCON/C  的 hcomp  调用。
编译源代码将生成一个对象文件 (在示例 cipuserthreshold. o  中),该文件应集成到用 户扩展库 (halconuser ) 中。此外,生成的接口代码必须转换为相应的语言相关接口库:在 C  应用程序的情况
下,这是包含 HChalconuser 的 halconuser 。 目录%HALCONEXAMPLE%                                \extension_package\halconuser 中的文件 makefile  包含一个 make  文件,用于在 UNIX  下 生成示例包本身使文件。win  是通过 Windows  下 nmake  使用的相应文件制作文件。
/* action procedure*/
Herror IPBThreshold(proc_handle,region,image,
width,threshold,region_out)
{
 
}
/*supply procedure-alwayswith this parameter!*/
Herror CIPUserThreshold(Hproc_handleproc_handle)
{
HGetCPar(. .,&Threshold,. .);/*getcontrol*/
/* parameter*/
HAllSegm(proc_handle,&region,&image, 1,i)/*workonall*/
/* inputimages*/
{
HCkP(proc_handle,IPBThreshold(. . .));/*callaction*/
/* procedure*/
HNewRegion(proc_handle,region_out);/*store(result)*/
/* region*/
}
return(H_MSG_TRUE);
}
图 5 :供应的源代码示例 CIPUserthreshold  () 和操作 IPBthreshold  () 过程。
 
Makefile_testprog 和 makefile_testprog 使用新运算符生成示例应用程序。现在,我们可 以在 C  程序中使用新的运算符。但它们在 HDevelop 开发中尚不可用,因为在线帮助文件 迄今尚未生成。还缺少任何类型的文档,如 HTML  手册页。
hcomp-u-Mthreshold.Def
图 6 :调用 HALCON  编译器 hcomp  来创建帮助文件。
在线帮助文件(例如,由 HDevelop 开发使用) 也可以在 HALCON  编译器 hcomp  的 帮助下生成,参见图 6 。但是,要执行此操作,必须提供 def 文件的扩展版本。生成的帮 助文件必须放置在包的子目录帮助中。
现在生成的帮助文件用于通过调用特定的 HALCON  运算符 (如 get_operator_info ) 来访问有关新运算符的信息。这一点对于构建像 HDevelop 开发这样的图形用户界面尤为 重要。对于用户来说,联机访问信息的更方便方法是浏览 HTML  文档。HALCON  运算符 的 HTML  文档也可以由 hcomp  生成,参见图 7 。HTML  文件必须放置在包的相应子目 录文档html 引用中。
DEF  SOURCES=def/threshold.def
HCOMP=$(HALCONROOT)/bin/$(HALCONARCH)/hcomp
all:html
Html:$(DEF_SOURCES)
 
图 7 :生成 HTML  引用的 Makefile。
如果现在将包路径添加到 HALCONConss  并开始 HDevelop  开发,则用户扩展 (例 如 user_thresh) 将自动在指定的菜单 (即章节) 中可用。
在          我          们          得          示          例          中 在%HALCONEXAMPLES%\extension_package\halconuser\def\threshold.def 6. 您可以选择并 执行用户定义的运算符,就像 HALCON  系统的所有内置运算符一样。HTML  文档可通过 操作员窗口中的帮助按钮获得。
有 关 如 何 在   HDevelop    中 使 用 用 户 定 义 的 扩 展 的 示 例 ,  请 参 阅%HALCONEXAMPLES%\extension_package\halconuser  (*.dev ) 的子目录示例。此外, 开发程序已导出为 C#  和 C#  程序。*.cpp  和 *。cs  文件可以在子目录源中找到。您可以 使用前面提到的 makefiles  编译它们。这些 *.cpp  和 *。cs  文件还充当将用户定义的运算 符集成到主机语言 C#  和 C#  的示例。请注意,在编译包含来自包 halconuser  的运算符 的 导 出 的  C#   和  C#   代 码 之 前 ,  必 须 已 创 建 相 应 的 用户 扩 展 库 。 这 可 以 通 过%HALCONEXAMPLES%\extension_package
\halconuser   中 的 makefile   来 完 成 ,  该 文 件 还 将 生 成 所 需 的 用 户 扩 展  C++   库 halconusercpp  和 .NET  程序集 halconuserdot-net。
请注意,在某些系统上,并非所有用户都具有上述目录中的写入权限。要试用示例包, 我们建议在工作目录中创建私有副本。在这种情况下,在修改环境变量时,当然必须使用 副本的实际路径。
收缩