halcon初级应用攻略

标准 Halcon 应用攻略 1、Halcon 的自我描述 Program Logic ? Each program consists of a sequence of HALCON operators ? The program can be structured into procedures ? The sequence can be extended by using control operators like if, for, repeat, or while The results of the operators are passed via variables ? No implicit data passing is applied ? Input parameters of operators can be variables or expressions ? Output parameters are always variables ? HDevelop has no features to design a graphical user interface An HDevelop program is considered as a prototypic solution of the vision part of an app lication ? HDevelop is typically not used for the final application 由此可以看出, Halcon 的定位是一个类库, 有着完整、 快速实现函数, 同时提供了 HDevelop 作为快速开发的图形化(IDE)界面;但是,Halcon 程序并不是一个完整的最终应用软件, 它没有用户界面,也不提供显示的数据(公用的数据格式) 。Halcon 的初学者也应当从参考 Halcon 的程序入手,熟悉 Halcon 类库,也即 HDevelop-Based Programming;在此基础上, 进入 ORClass-Oriented Programming。这也是 Halcon 推荐的开发方式: The vision part is solved with HDevelop , and the application is developed with C++ or Visual Basic。 2、HDevelop 界面的学习 通过阅读 Halcon 的 PPT,学到了下面一些有用的信息: 文件——浏览示例,可以看到很 多有用的例子;? 程序窗体中,可以浏览与编辑 Procedues(过程) ,这个其实就是自定函 数咯~还 可以自己修改这些过程,并添加说明文档; F4——将函数语句注释掉;F3——激活; 本地过程(Local Procedue)与外部过程(Externel Procedue) 3、 基本语法结构 Halcon 的语法结构类似于 Pascal 与 Visual Basic, 大部分的语句是 Halcon 提供的算子,此外也包含少部分的 控制语句; 不允许单独声明变量; 提供自动的内存管理(初始化、析构及 OverWrite) ,但句柄则需要显示释放; C++(算子模式) 通过代码导出,以 C++为例,默认导出为算子型的语法结构,而非面向对象的;在此模式 下,全部函数声明为全局类型,数据类型只需要用 Hobject、HTuple 两类类型进行声明; C++(面向对象) 可以以面向对象的方式重写代码,也即利用类及类的成员函数;在这种模式下,控制变量 的类型仍未 HTuple,而图形数据可以由多种类型,如 HImage 等; 其他语言(略)

4、Halcon 数据结构

两类参数:图形参数 Iconic (image, region, XLD)与控制参数 Control (string, integer, real, handle),在 Halcon 算子的参数中,依次为:输入图形参数、输出图形参数、输入控制参数、 输出控制参数;并且其输入参数不会被算子改变。 图形参数 Iconic :Images ? Multiple channels Arbitrary region of interest Multiple pixel types(byte, (u)int1/2/4,real, complex, direction, cyclic, vector_field) byte, uint2 //灰度图像的标准编码 int1, int2 //Difference of two images or derivates with integer precision(??)int4 //两幅灰度图的频谱 direction //图片边缘的梯度方向 real //边缘提取及特定灰度值的轮廓 complex //图片频率分布 cyclic //Assigning one "gray" value to each color(??) vector_field //连续图形的光学流分布 Regions Efficient data structure (runlength encoding) Extensive set of operators Fastest morphology on the market 图形编码中,需要了解 row 和 run 两个术语;也是 Halcon Region 存储的方式 Extended Line Description (XLD) Subpixel accurate line and edge detection ? Generic point list based data structure Handling of contours, polygons, lines, parallels, etc. 此外,Halcon 支持的类型还包括图形元组、控制变量元组及句柄:元组的概念,使得可以 用一个变量传递数个对象,可以由重载后的函数来进行处理;图形元组的下标从 1 开始,控 制变量元组下标从 0 开始;句柄则可以用来描述窗体、文件等等,句柄不能是常量。 5、Halcon 语言 输入控制参数可以是表达式,但图形参数、输出参数均应为变量; String 类型变量由单引号’括起来;此外还有一些特殊字符; Boolean 型变量包括 true ( = 1 )、 false ( = 0 ) ;不为零的整数将被认为 true;但绝大多数的 Halcon 函数接受字符串型的表达: ’true’ ‘false’ ,而非逻辑型表达;函数返回常量用于标 识错误: H_MSG_TRUE no error 2 H_MSG_FALSE logical false 3 ? H_MSG_FAIL operator did not succeed 5 可以放在 try?catch?endtry 块中,也可以用 dev_error_var()与 dev_set_check() 来捕获; 控制语句结构: (与一般语言略有不同,它们也有输入输出变量) if ... endif / if ... else ... endif / if ... elseif ... else ... endif for ... endfor while ... endwhile

? repeat ... until 此外,也有关键字 break、continue、return、exit、stop 用来控制语句的执行;赋值语句在 Halcon 中也被当作函数来使用: 标准赋值 assign(Expression, ResultVariable) //编辑形式,永远都是输入在前,输出在后 ResultVariable := Expression //代码形式 元组插入赋值 insert(Tuple, NewValue, Index, Tuple) //编辑形式 Tuple[Index] := NewValue //代码形式 控制变量元组操作 [t,t] concatenation of tuples |t| number of elements t[i] selection of an element t[i:j] selection of a part of a tuple ? subset(t1,t2) selection from t1 by indices in t2 图形元组操作对应函数 [] gen_empty_obj () |t| count_obj (p, num) [t1,t2] concat_obj (p1, p2, q) ? t[i] select_obj (p, q, i+1) t[i:j] copy_obj (p, q, i+1, j-i+1) subset(t1,t2) select_obj (p, q, t2+1) 元组的数学运算,如:A * B,令 m = |A|, n = |B|; 若 m、n 不相等,且都大于 1,则错误;否则返回三种情况: m=n=1,返回一个值; m=n>1,返回一个包含 m 个数的元组,值为两元组各对于值的操作结果; m>1,n=1,返回一个包含 m 个数的元组,值为第二个数与第一元组各值的操作结果; Halcon 的数学运算 算术运算 a / a division a % a rest of the integer division a * a multiplication v + v addition and concatenation of strings a - a subtraction -a negation 位运算 lsh(i,i) left shift rsh(i,i) right shift i band i bit-wise and i bor i bit-wise or ? i bxor i bit-wise xor bnot i bit-wise complement

字符串操作 v$s conversion to string //字符串的格式化,有很丰富的参数 v + v concatenation of strings and addition strchr(s,s) search character in string ? strstr(s,s) search substring strrchr(s,s) search character in string (reverse) strrstr(s,s) search substring (reverse) ? strlen(s) length of string s{i} selection of one character s{i:i} selection of substring split(s,s) splitting to substrings 比较操作符 t < t less than t > t greater than t <= t less or equal t >= t greater or equal t = t equal t # t not equal 逻辑操作符 not l negation l and l logical ’and’ l or l logical ’or’ l xor l logical ’xor’ 数学函数 sin(a) sine of a cos(a) cosine of a tan(a) tangent of a asin(a) arc sine of a in the interval [-π /2, π / 2], a ∈ [-1, 1] acos(a) arc cosine a in the interval [-π /2, ?π /2], a∈ [-1, 1] atan(a) arc tangent a in the interval [-π /2, π /2], a ∈ [-1, 1] atan2(a,b) arc tangent a/b in the interval [-, ] sinh(a) hyperbolic sine of a cosh(a) hyperbolic cosine of a ? tanh(a) hyperbolic tangent of a exp(a) exponential function log(a) natural logarithm, a> 0 log10(a) decade logarithm, a> 0 pow(a1,a2) power ldexp(a1,a2) a1 pow(2,a2) 其他操作(统计、随机数、符号函数等) min(t) minimum value of the tuple max(t) maximum value of the tuple min2(t1,t2) element-wise minimum of two tuples max2(t1,t2) element-wise maximum of two tuples find(t1,t2) indices of all occurrences of t1 within t2

rand(i) create random values from 0..1 (number specified by i) sgn(a) element-wise sign of a tuple sum(t) sum of all elements or string concatenation cumul(t) cumulative histogram of a tuple mean(a) mean value deviation(a) standard deviation sqrt(a) square root of a deg(a) convert radians to degrees rad(a) convert degrees to radians real(a) convert integer to real int(a) convert a real to integer round(a) convert real to integer number(v) convert string to a number is_number(v) test if value is a number abs(a) absolute value of a (integer or real) fabs(a) absolute value of a (always real) ceil(a) smallest integer value not smaller than a floor(a) largest integer value not greater than a fmod(a1,a2) fractional part of a1/a2, with the same sign as a1 sort(t) sorting in increasing order uniq(t) eliminate duplicates of neighboring values(typically used in combination with sort) sort_index(t) ,return index instead of values median(t) Median value of a tuple (numbers) select_rank(t,v) Select the element (number) with the given rank inverse(t) reverse the order of the values subset(t1,t2) selection from t1 by indices in t2 remove(t1,t2) Remove of values with the given indices environment(s) value of an environment variable ord(a) ASCII number of a character chr(a) convert an ASCII number to a character ords(s) ASCII number of a tuple of strings chrt(i) convert a tuple of integers into a string 6、Halcon 名称解释 Operator: A procedure of the HALCON library used in HDevelop or one of the language interfaces. Procedure (of HDevelop): A subroutine defined for the use inside HDevelop. Region: Result of a segmentation like threshold. In other systems called blob, area, binary image, or island. Implemented using runlength encoding. XLD: Extended Line Description. Universal data structure used to handle contour based data. Mainly used in the context of subpixel precise measurement. Domain: Part of the image which is used for processing. In other systems called ROI (region of interest). Channel: One image matrix of a multi-spectral image. One example is the red channel of

an RGB image. Iconic data: Overall term for images, regions, and XLD data. In object oriented languages (C++ and COM) and in HDevelop iconic data is represented by a polymorphic data type. In object oriented languages iconic data is also called iconic object. Control data: All non iconic data. Examples are single values (integer, real, and string), coordinates, arrays of values. Tuple: an array of values where each element can be of a different type. One can have both iconic and control tuples. HALCON object: Synonym for Iconic object / data Image acquisition interface: Interface between the frame grabber /camera driver (SDK) and the HALCON library. The Image acquisition interface is a DLL which is dynamically loaded when calling open_framegrabber. Language interface: Software that enables the programmer to use the HALCON library in a given language (e.g., C++). Extension Package: A mechanism that enables the user to fully integrate user-defined procedures into the HALCON environment. The extension package concept gives full access to the internal data structures of HALCON. License file: File “ license.dat “ in the directory “ license “. This file is used together with hardware components (dongle or Ethernet card) to check if a correct license is available. Help files: Files in the directory “help“ which are used to get online information about all HALCON operators. This is extensively used by HDevelop. Shape-Based Matching: Finding of an object in an image based on a predefined model. The shape based matching uses features to quickly locate objects very precisely. Variation Model: A method to do print checking by presenting multiple good patterns to the system. The variation model learns the normal variation a good pattern and based on this informati on can detect real defects. Measure Tool: A set of operators to find the exact location of edges along lines or circular arcs. Ot her systems call the similar tool, e.g., caliper. Accuracy: The deviation from the true value Precision: The standard deviation of the measurement 7、Halcon 函数 典型函数 Filtering (noise, smoothing, edge, bit, arithmetic, enhancement) Segmentation (thresholding, topology, region growing, classification, comparison) Region processing Morphology Feature extraction Edge detection Color processing and classification OCR / OCV Bar code / data code Measurement Rectification

Gray value matching 8、Halcon HDevEngine HDevEngine 允许用户在应用程序中直接调用 Halcon 程序(*.hdvp) ,适用范围包括 C++、 COM、.NET 语言。具体功能为: 载入并执行 Halcon 程序(HDevelop programs) 载入、删除、执行 HDevelop 过程(HDevelop procedures) 查询以载入的 HDevelop 过程的接口 将正确的参数值传递给 HDevelop 过程,执行并获得结果 重新实现了 HDevelop 的某些内部算子(operator) ,例如 dev_display HDevEngine 错误处理在 C++中,使用 HDevEngine 需要包括头文件 #include "HDevEngineCpp.h",并包含附加的可执行文件 hdevenginecpp.lib,具体见示例。 利用 HDevEngine,可以很方便得实现多线程。 9、Halcon 数据结构(2) Halcon 中,Image = Channel + Domain , 像素点存放在 Channel 矩阵中,根据 ROI 来描述 Image。 Image 相关操作: 输入:从文件、从设备 生成:外部图像数据、空内存区域; 显示:disp_image()图像首通道灰度图;disp_color() 彩色图;disp_channel()某特定通 道;disp_obj() 自动判别类别; 缩放:set_part() 设置显示区域;set_part_style() 设置显示参数; 3D 显示: (略) Rules to Display Gray Images 没特别懂 边界点的处理:镜像、常数、延续、周期(略) : 域的局限性:一些算子总是要处理周围的矩形区域,比如 mean_image(),并且总是先处理 小的区域; 测量工具中的 ROIs 比较特殊, 这种 ROIs 并不依附于 Image 上, 而是在算子 gen_measure_*() 后产生,并且也只能是任意朝向的矩形、圆弧形区域; 处理多通道图像: 分 割 : Gray operators 仅 适 用 第 一 通 道 , Color operators: 使 用 前 三 个 通 道 , Multi channel operator 会使用全部通道;//对“Gray operators 仅适用第一通道”的解释:实 际上,灰度图,就是用第一通道(Red)像素点值所构建出来的那幅图。? 过滤:所有通道被处理时均使用相同的参数,并且结果的通道数与处理的图片相同; 可以将域的处理结果,与原图像结合在一起作为输入图像; 通道处理:count_channels(),decompose*(), compose*(), access_channel(), append_channel(), channels_to_image(), image_to_channels() 图像金字塔中,第一个图像为最大的图像,各图像有各自的区域 标准图形(Shape) :circle、ellipse、rectangle1、rectangle2、line、polygon

特殊区域图形:gen_grid_region(): grid、lines、points, gen_checker_region() 图像处理: ?

修改:set_grayval() : Modify one or more pixels of the input image;paint_gray(): Paint part of an image into another image; overpaint_gray(): Paint part of an image into the input image; paint_region(): Paint the region with a constant gray value into an image; overpaint_region() : Paint the region with a constant gray value into the input image 复制: crop_part(): Crop a rectangle, given by upper left corner and size; crop_rectangle1(): Crop a rectangle, given by upper left and lower right corner; crop_domain(): Crop area of the smallest r ectangle1 of the domain; crop_domain_rel(): Like crop_domain but with the possibility to change the size of bounding box; change_format(): Limit the size of the image at the lower or the right par t; get_grayval(): Access one or multiple pixel values Tile: tile_images(), tile_images_offset(), tile_channels() 10、Halcon 数据结构(3) 区域运算: 并:union1()、union2(); 交:intersection(); 差:difference(); 补:complement(); 图形显示参数设置: 显示模式:set_draw(); 参数:margin、filled 线宽线形:set_line_width(); set_line_style(); 颜色:set_color(); set_colored(); set_rgb(); set_gray(); 显示图形:set_shape(); 参数:original、outer circle、inner circle、rectangle1、rectangle2、 ellipse、icon set_icon 11、Halcon 数据结构(4) 关于 XLD,简要写一下: 图像均用像素点保存,而像素点是整型的,不连续的;Halcon 做了拓展,定义了亚像素 (subpixel)的对象:xld;其实 xld 已经用过了,比如提取边缘、构建轮廓等等,xld 在模板 匹配、图形校准等多方面有重要的用途。 12、色彩 color 在视网膜底部,有三类感光细胞,它们分别探测不同频率的光,产生 RGB 神经冲动,并把 这些神经冲动传递下去;经过另外的细胞的处理,转换成 1 个亮度通道、两个色彩通道。 The RGB stimulus is converted to a luminance and 2 chrominance channels 所以,RGB 图是原始的感光图,而人眼的感觉,却不是 RGB 三通道的叠加;更直观地描述 人的感觉,需要用到其他的色彩空间,比如 hsv 空间。 不同频率的光,会产生不同的颜色;而光只有三种颜色,这是因为人眼只有三种光感受器。 所以有,任何光产生的颜色,都能够由这三种纯色来合成,这就是光的三元色。 对于相机来说,能够检测到的光谱范围比人眼要宽泛,比如红外相机等;为了获得人眼类似 的图像,可以加上过滤装置,滤去超出 400-700nm 范围的光线。 13、色彩空间及 Halcon 颜色处理 CCD 彩色相机有 R、G、B 三种感光芯片,捕捉不同颜色,然后转换为 RGB 三通道。颜色空间: RGB Red、Green、Blue 三色通道,对光来说,犹如在黑暗中点亮各分色。

CMY Cyan、Magenta、Yellow 三颜色通道,犹如在白纸上图颜料 YUV、YIQ Y 描述亮度、其余两通道描述颜色(的差值) ,用于电视转播 ARgYb 与上类似,A 描述亮度,其余两者描述颜色差值 I1i2i3 与上类似,i1 描述亮度 HSI Hue、Saturation、Intensity 分别描述颜色、饱和度、亮度 HSV 与上类似,这里的 V 描述亮度,方法与上不同 HSL 与 HSI 类似,L 描述亮度,但 Hue 与之不同 HIS 与 HIS 类似 Uniform Color Space、CIE uv 用二维图描述色彩 CIE Lab 高级色彩空间,较少使用 颜色空间的转换,依靠 GPU 进行运算:trans_from_rgb(),速度快 Scale_image() 可以对单通 道(RGB、或 HSV 中的)进行重新渲染; 颜色的选取,通过对 Hue 通道进行 threshold() 2D Histogram 可用来描述两通道(RGB、HSV 等中的)相应值对应关系,可用来选取颜色 相近区域:histo_2dim() N 维像素分类:learn_ndim_norm()、learn_ndim_box() LUT:MLP、SVM、GMM 彩色过滤器:用于彩色图像的分割等:edges_color()、edges_color_sub_pix()、lines_color() 14、Halcon 窗体 Halcon 窗体的坐标系统:(Row, Column) (Width, Height) 图形:可以显示灰度图、彩色图、3D;定义要显示的区域,插值 区域:绘图模式(Fill、Margin),边界、线宽,定义色彩模式,自动图形转换 绘图:点、线、xld 等

标准 1 编写一个简单 HDevelop 程序 本章主要介绍怎么使用 HDevelop 来设计机器视觉应用程序。只要你跟着演示的运行例子练 习, 就能轻松学会。如下例, 假定 HDevelop 的参数选择为默认值。 每个刚安装好的 HALCON 中都会有这样的实例。 在不确定当前设置的情况下, 你可以在命名行使用下面这条代码来启 动 HDevelop: hdevelop ‐reset_preferences 本章中介绍一个简单例子,目标是计算并确定回形针的位置和方向,回形针如下图:

1.1 启动一个新程序 启动 HDevelop,或者 HDevelop 正在运行,可单击菜单栏中“文件=>新程序”来启动一个 新程序。如果在当前程序中有未保存的更新,HDevelop 会自动提示你是否保存。如果出现 提示,单击“放弃” ,启动一个新程序 要是重要是窗口重叠,可以单击菜单栏中“窗口=>排列窗口”恢复到默认显示布局如下图:

1.2 输入一个算子 点击进入“算子窗口”的文本框,输入“read_image”然后按回车键。也可以输入任何部分 算子名,然后按回车。HDevelop 会根据你输入的部分算子名打开一个与之相应匹配的算子 列表。这样可以很容易的选择算子,而且不用输入完整的算子。当鼠标或光标移动到所要选 的算子时,该命令会变亮,单击然后按回车即可执行该操作。如果不小心选错了算子,可以 重新点击列表旁边的下拉箭头,选择正确算子。如下图所示:

1.3 设置参数 选择一个算子后,它的参数会显示在“算子窗口” 。它们被分为图形参数和控制参数。参数 名旁边的图形表示输入输出的参数类型(如下图所示) 。参数的右边显示的是语义类型。 文 本框中设置参数值。

在 Image 文本框中输入 Image,则图像将被保存到这个变量中。然后,在 FileName 文本框 中输入'Clip'。点击“确定”或按回车键,把算子输入到程序。点击帮助按钮,可以获取该 算子的详细信息: 1.4 获取帮助 HDevelop 提供了一种便捷的访问算子帮助文档的方法。在程序编辑器中双击程序的首行。 相应的算子将会显示在算子窗口,这个时候点击“帮助”打开 HDevelop 的帮助窗口,它会 自动跳转到算子对应的文档,如下图所示:

参考手册是相互链接的。 窗口的左侧导航部分提供了快速访问其它文档的直接途径。 标签页 “目录”是一个层次结构的参考手册(加上了 HALCON 的其他参考手册)。标签页“算子” 列出所有算子,可以直接访问。在过滤栏输入部分字符串,能快速找到所需的算子。 在本章的其余部分,尽可能多的使用在线帮助来获取使用算子的信息。 1.5 继续编写程序 1. 通过阈值分割回形针 现在,我们想要把回形针和背景分离出来。回形针和背景区别明显,可以选择基于灰度值分 割的方式,这个操作称为阈值分割。在算子窗口中输入 threshold,按下<回车>,可以得到 一列匹配的算子。再次按<回车>确认所选算子或用鼠标选择算子:

在上图中可以看到, 输入参数 Image 被自动设置为 Image, 分别设置 MinGray 和 MaxGray 为 0 和 30, 这样就将选择图像中像素暗的部分。单击“应用” ,这个按钮执行时没有把算子添加到程序 中,它使当前参数保持为打开可编辑状态。通过这种方式,可以轻松地尝试不同的设置并 立即看到结果。 被选中的像素(区域)存储在图形变量 Region,该区域以 overlay 的方式在 图形窗口显示。变量 Region 显示为红色(默认设置)。所设置的阈值稍后还需要精确调整。 这时候点击“输入”添加算子到程序窗口。如果是单击“确定” ,我们可以注意到图像变量 区域和图形窗口保持不变,但算子窗口不显示了。

2. 后继函数 选中刚插入的程序行,打开菜单栏中的 建议=>后继函数。这个菜单动态显示当前选择算子 的典型后继函数。我们的目的是把选择的像素分割成区域,把鼠标光标移动到后继函数菜 单项,选中的算子,这时在状态栏有一个简短描述。通过浏览后继函数菜单项,发现 connection 算子符合要求,选择该算子:

再按回车键,这相当于单击“确定”按钮。这时 threshold 算子和 connection 算子这两行程 序被执行。在图形窗口中,通过 connection 计算得到的区域用不同的颜色显示。 1.6 理解图像显示 在程序执行三行后,图形窗口显示了三层图像变量:图像 Image,区域 Region,和区域元 组 ConnectedRegions。让鼠标光标在“变量窗口”的图形上移动,来获取关于变量的基本 信息。 可以从“图形窗口”的右键菜单中调整图像和区域的显示属性。对于图像, 在“图 形窗口” 中可以设置查找表(LUT, 指定灰度值映射)和显示模式 (参考右键菜单的 “打印” ) 。 还可以尝试不同的设置:在图形窗口单击右键弹出菜单,更改“ LUT” , “打印” , “颜色数 量”等选项的值。尝试过不同设置后,单击重置按钮恢复默认可视化设置。 1.7 核对变量 当鼠标光标移动到图形变量 ConnectedRegions 图标时,会看到提示有 98 个 region。在 ConnectedRegions 图标上单击右键并选择“清除/显示” ,把 ConnectedRegions 显示在图形 窗口。再次单击右键并选择“显示目录=>选择....” ,如下图所示:

这个菜单项打开了一个列出 ConnectedRegions 变量内容的检查窗口。在检查窗口所选择的 区域,使用当前可视化设置参数在图形窗口中显示。 设置填充模式“画”为“margin” ,设置“形状”为 ellipse,然后从列表中选择区域,下图 显示的椭圆所在的区域为选择的区域:

然后关闭变量检查窗口。 因为 threshold 算子参数设置的值太粗糙,导致分割出大量的区域。接下来使用 HDevelop 的可视化工具找到更合适的阈值。 1.8 使用灰度直方图改善阈值 点击菜单栏中的“可视化=>灰度直方图”打开灰度直方图工具。灰度直方图的用途之一是 确定阈值范围。 因为当前图形窗口只显示区域,所以灰度直方图最初是空的。在变量窗口中双击图像图标, 在图形窗口显示原始图像,这时灰度直方图就出现。 在灰度直方图窗口操作列表中选择“阈值” ,然后单击阈值旁边的图标,开启 使能输出,来实现可视化操作。这时你可以通过改变最小和最大值或通过拖拽直方图中的 行区域来尝试不同的阈值范围(如下图所示)。 这些值的任何更改都会立即在活动的图形窗口 中体现出来。通过不断调整, 0 和 56 适合作为上下边界。

1.9 编辑程序行 如前所述,在 HDevelop 中默认的编辑模式是基于对话框的。前面例程中,程序中所有参数 的修改是在“算子窗口”中进行。在“程序编辑器”窗口中双击一行程序来对它进行编辑, 然后编辑的参数会在“算子窗口”中显示出来。你点击“确定”或“Enter”的话,原始程 序行就会被刷新。在后续章节有完整的关于程序编辑器的介绍。 双击第二行程序来调整阈值, 在“算子窗口”中把 30 换成 56 后点击“确定”或“Enter” , 这样“程序编辑窗口”中程序就会随之更新。 1.10 重新执行程序 编辑程序的最后步骤是对程序进行细微的修改。 通常情况下,在程序编写很多行后,变量会发生很多改变,这时需要重置程序,恢复到初 始状态,然后再次运行,观察变量的变化。 点击菜单栏中的“执行=>重置程序执行”来重置程序。 这个时候选择“执行=>运行”就能完整的运行程序,或者点击“执行=>单步跳过函数”来 可逐行运行程序。 1.11 保存程序 编写程序时,要及时保存并且备份程序。选择“文件=>保存” ,设置好路径、文件名,然后 保存程序。 1.12 根据特征值选择区域 改变阈值后得到新的区域 ConnectedRegions, 检测区域 ConnectedRegions, 发现结果已经 有所改善。然而,在图像左上角,还存在一个干扰区域。为了得到只包含有回形针的区域, 我们需要进一步改进。类似于灰度直方图工具, HDevelop 还提供了一个特征值直方图工 具,它有助于选择拥有共同属性或特性的区域:

实际中所有的回形针都是一样的大小(面积,area) ,因此回形针区域的共同特征是面积。 在特征直方图中,横轴的数值对应于所选的特征的数值。纵轴的数值为某一特征值的频率, 即该特征值出现的总个数。和灰度直方图窗口一样,可以可视化被选中的区域,这些区域 位于由绿色竖线(最小值)和红色竖线 (最大值) 之间。 特征直方图窗口中的参数如下图所示:

拖动绿线和红线,看看对所选择的区域有什么影响。为了在直方图中看到所有的回形针, 我们可以在直方图中选择特征值从 4100 到最大值之间区域。当调整到满意的特征值时,点 击“插入代码” 。 以下代码会被添加到鼠标所在位置行的程序中 select_shape (ConnectedRegions, SelectedRegion, 'area','and', 4100, 5964) 运行程序, 观察 输出变量 SelectedRegions。现在回形针的区域就正确了。 在程序中添加以下算子来获得回 形针的方向和重心: orientation_region (SelectedRegions, Phi) area_center (SelectedRegions, Area, Row, Column)

算子 orientation_region 会返 回一个元组 Phi ,数值 的每个元素 的值表示: 对象元组 SelectedRegions 中对应个区域的方向。 同样, 算子 area_center 把每个区域的 area, row 和 column 的值以元组的方式返回。 再次运行程序并观察计算出来的控制变量。你能在一个变量观察窗口中观察多个控制变量。 在变量窗口中选择控制变量(同时按住 Ctrl 不放) ,然后单击右键选“检测” 。如下图所示:

标所在的行。点击“确定” ,程序中添加了 for 循环: for Index := 0 to |Phi|‐1 by 1 endfor 把 for 循环中添加如下代码: set_tposition (3600,Row[Index],Column[Index]) write_string (3600, deg(Phi[Index]) + ' degrees') 算子 set_tposition 把图形窗口中的文本光标位置移至索引 Index 所对应的区域的的中心位

置 。 3600 是 目 标 图 形 窗 口 的 窗 口 句 柄 , 显 示 在 窗 口 的 标 题 栏 : ,并且 会因不同窗口的不同而变化,即每个图形窗口对应一个唯一的窗口句柄。 Row[Index]是 HDevelop(编程)语言的另一个算子。通过它来访问 tuple 元组的一个元素。 算子 write_string 的作用是在图形窗口中,在当前文本光标位置输出定字符串。算子 deg 也 是 HDevelop(编程)语言的一部分,它的作用是把弧度转换成角度。在本例中,算子+的 作用是把字符串串联在一起,产生一个新的字符串。在两个操作数相+之前,HDevelop 会 自动进行一个数据类型转换, 把 deg(Phi[Index])从 double 数据类型转化为 string 数据类型。 更多关于 HDevelop(编程)语言的介绍在《HDevelop 编程语言》这一章中。 1.14 小结 这节介绍了 HDevelop 编程的基本的方式:在算子窗口,选择一个算子,为其设置参数,使 用“应用”按钮尝试不同的设置值, 用“输入”或“确定”添加一个新程序行,还可以在 “程序编辑器”窗口通过双击来编辑它。HDevelop 提供了很多交互式工具来辅助开发。 2 HDevelop 图形用户界面 这章介绍 HDevelop 的图形用户界面。 注:后文中的过程函数、过程和函数,意义一样,表示相同的东西。 2.1 主窗口

主要的窗口如下(从左到右,从上到下) : 图形窗口、算子窗口、变量窗口、程序窗口

(1)显示处理时间:切换执行消息是否显示在状态栏上。 (2)复制历史到剪贴板:把运行的历史信息复制到剪切板,可以用在其他文档(如 word, text 等)粘贴。 (3)打开输出控制台 在单独的输出控制台窗口中显示消息历史记录

2.1.6 窗口模式 在 hdevelop 中有两种不同的窗口模式,在窗口菜单中可以切换: (1)MDI (多文档界面) : 在这种模式下的主窗口包含了所有其他的窗口和对话框(在线帮助窗口和暂时禁止其它窗 口的静态弹出框除外) 。在主窗口内,你可以根据你的需求和爱好自由移动窗口。你可以决 定是否将它们图标化。

(2)SDI(单文档界面) : 在这种模式下,所有的窗户都是独立的。菜单栏,工具栏和状态栏,迁移到第一个程序窗 口。 2.2 菜单栏 主窗口的菜单栏提供访问 HDevelop 的全部功能。在这,可以选择算子和过程,控制图像的 输出。每个菜单项可以打开一个下拉菜单(以下简称菜单)与可选的子菜单。您可以通过 单击菜单项或通过键盘(按<Alt>键结合菜单项中带下划线的字母)打开一个菜单。下面的 章节这些项目将会按照他们出现的顺序介绍。 2.2.1 文件菜单

此菜单的功能是加载图像和程序,并保存最近创建或修改的程序和过程。此外,您可以导 出 HDevelop 程序到 C+ +,C,Visual Basic Visual Basic.NET 或 C#,也可以打印出来。 HDevelop 程序存储为以下文件格式: (1)Halcon9 以后(不包括 9) : 程序:.hdev 函数: .hdvp (2)Halcon9 前(包括 9) : 程序:.dev 函数: .dvp 2.2.1.1 新程序 功能:新建一个新的 HDevelop 程序。 快捷键:Ctrl+N 2.2.1.2 打开程序... 功能:加载现有 HDevelop 程序 快捷键:Ctrl+O 弹出一个文件选择对话框, 然后选择一个 HDevelop 程序。 请注意, 只有 HDevelop 程序 (.hdev 或.dev)可以加载。因此,文本,C,C ++,Visual Basic, Visual Basic.NET 和 C#版本将 被拒绝。 加载程序之后,相应的文件名被添加到菜单中当前程序的顶部。这允许你在最近加载的程 序之间快速切换。 2.2.1.3 浏览例程...

功能:从分类列表中选择一个 HDevelop 例程。 快捷键:Ctrl+E 选择这个菜单项会打开一个对话框,允许你加载分类中的任一 HDevelop 示例程序,如下图 所示:

1. 在对话框的左侧的项中包含分类的结构化列表。点击一个分类前的图标切换其子选项的 显示。或者,双击其中的任何分类标签显示和隐藏的子选项。如果你选择一个分类,其所 有匹配的例子程序列在该区域。您可以通过按住<Ctrl>键的同时单击其他的分类,这样来 选择多个分类。 一个 HDevelop 示例程序会根据不同的主题和分类多次出现。 2. 过滤功能: 可以在过滤文本框中输入一个关键字来减少搜索的程序的数量。过滤所得到的例程,会显 示程序文件名和程序的简短说明。过滤的关键字是不区分大小写的。 3. 加载示例程序 双击列表中的一个示例程序,或者选择它并点击按钮“打开” 。如果当前程序中未保存,使 用“在新的 HDevelop 中打开”程序,这种方式很有用的 4. 如果想快速浏览几个示例程序,可以勾选上“保持对话打开” 。 2.2.1.4 当前程序 功能:加载最近使用 HDevelop 程序。 此子菜单包含最近使用的 HDevelop 程序的列表。只需单击一个程序名来加载它。在此菜单 中的文件数量可根据需要进行设置,在 编辑=> 参数选择?:

2.2.1.5 插入程序 功能:插入其他的 hdevelop 程序、过程到当前程序。 2.2.1.5.1 插入所有? 功能:将一个完整的 HDevelop 程序插到当前程序。 把所选程序的主过程和所有本地过程插入到当前程序。 如果插入的本地过程的名称与已有 的过程冲突,前者会重命名,添加后缀_COPY_1(或_COPY_2,_COPY_3......) 。 注意:插入的本地函数名和已加载的外部函数名一样时,将隐藏外部函数,那么在调用到 隐藏的外部函数时,需要对其进行调整。可通过以下方式找出的程序中包含的隐藏的外部 函数:过程=>外部过程设置... =>外部函数。 2.2.1.5.2 插入过程 功能:将选择的程序的本地过程插入到当前程序。 通过这个菜单项可以把一个 HDevelop 程序中除主过程以外的函数全部添加到当前的程序 中。 如果插入的本地过程的名称与已有的过程冲突, 前者会重命名, 添加后缀_COPY_1 (或 _COPY_2,_COPY_3......) 。注意:插入的本地函数名和已加载的外部函数名一样时,将隐 藏外部函数,那么在调用到隐藏的外部函数时,需要对其进行调整。可通过以下方式找出 的程序中包含的隐藏的外部函数:过程=>外部过程设置... =>外部函数, 2.2.1.5.3 插入主体 功能:将所选程序的主函数插入当前程序中。 将所选程序的主函数插入当前程序中。选择的程序的本地函数无法导入。如果当前的程序 不提供导入程序使用的函数,相应的程序行将被标记为无效的代码且不会被执行。无效的 代码如果添加缺少的函数会变成有效的代码。 2.2.1.6 保存 功能:保存当前 HDevelop 程序或当前选定的外部函数 快捷键:Ctrl+S 2.2.1.7 程序另存为... 功能:将当前的 HDevelop 程序保存到一个新文件。 快捷键:Ctrl+Shift+S 2.2.1.8 将函数另存为... 功能:将当前函数保存为一个外部函数或者成为一个独立的 HDevelop 程序。 使用这个菜单项你可以把当前的函数另存为一个外部函数或者一个 HDevelop 程序。 在保存 时,会弹出一个文件选择对话框,在这里可以选择保存文件的类型: (1)HDevelop 函数 (.hdvp 或.dvp)

该函数存为外部函数,如果目标路径尚未配置在外部过程路径中, HDevelop 将建议把该 路径增加到列表中。如下图所示:

如果你单击否,HDevelop 将无法访问已保存的过程,除非手动把该过程的路径添加到外部 函数路径列表。 (2)HDevelop 本地函数(*.hdev 或 *.dev) 如果该文件类型被选择时,产生一个空的主函数,并添加到目标文件中,选择的函数作为 一个本地函数添加到该程序。如果在程序窗口中选择主函数,这个菜单项无法使用。 2.2.1.9 保存所有 功能:保存当前的程序和所有修改外部函数。 快捷键:Ctrl+Alt+S 2.2.1.10 导出 功能:将 halcon 程序代码导出为一种可编程语言或者文本文档。 (1)导出对话框如下图所示

(2)导出文件及格式

导出范围用于选择导出程序的哪部分内容。有以下几种选型: 1)程序:整个程序将被导 出(主函数和所有的本地函数) 。所有的外部函数将根据外部函数属性来导出(参见下节) 2)当前过程:当前函数和所有使用的本地函数将被导出。所有的外部函数将根据外部函数 属性来导出(参见下文) 。 3)外部过程:所有的外部函数将根据外部函数属性来导出(参见下文) 。

函数属性如下: 1)导出本地函数内容:如果勾选,那么本地函数的声明和内容都将被导出。否则,只导出 声明。 2)导出外部函数内容:如果勾选,那么外部函数的声明和内容都将被导出。否则, 只有声明被导出。

3)导出所有引用的外部函数:如果勾选,所有引用的(即已使用的)外部函数和当前的程 序一起导出。 4) 导出所有函数到分开的目标文件中: 不勾选时, 外部函数将被导出到一个共同的文件中。 勾选时,外部函数导出到分开的目标文件中,文件名与函数名一致,文件的后缀名取决于 第(3)步选择的导出文件的格式。 5)仅在函数比导出文件新的时候进行导出:如果当前函数的时间戳比现有的目标文件中同 名的函数的时间戳新,那么把当前函数导出到分开的目标文件中。

2)使用导出模板(只有 HALCON/.NET 和 HALCON/COM 使用) :作为一个非独立的工 程导出。这种方式导出得到的文件,是工程的一个附属文件。使用 halcon 提供的模板工程 (基于 vb,c#等 IDE 环境的工程) ,加载这个文件,即可运行程序。使用这种方法,可以 很快捷的把 halcon 与 vb 或 c#等联合应用。

保持导出对话框一直处于打开状态。 2.2.1.11 读取图像 功能:添加图像到当前程序。 快捷键:Ctrl+R 这个菜单项提供了一种快速打开图像文件的方法,如下图所示:

2.2.1.12 清除 功能:清除长期不使用的图形变量、控制变量。 。 2.2.1.13 属性? 功能:显示当前程序的各种属性。 该选项栏一般显示当前程序文件的属性,如文件名,路径,创建和修改日期,和写入权限。 它显示了图像的尺寸,代码行数,使用的本地函数和未使用的本地函数的数量,以及使用 的外部函数和保护函数的数量。如下图所示:

选项栏“使用的模块”列出当前程序的 HALCON 模块。标有照明灯泡模块是被使用的。这 个窗口可以让你知道你的应用程序大概需要多少运行许可证。请参阅安装指南有关模块和 运行许可证的详细信息。 1. 选项:只检查使用的函数 如果选中,只根据使用的函数来确定程序使用的模块。否则,根据所有的函数来确定程序 使用的模块。 2. 按钮:拷贝到剪贴板 把使用到的模块的名称复制到系统剪贴板。这样的话列表可以很容易地粘贴到其他的应用 程序

2.2.1.14 打印 功能:打印当前的程序或者挑选的函数。 快捷键:Ctrl+P 打印对话框如下图所示:

1. 打印范围 (1)程序:完整的程序,包括所有函数 (2)当前函数:当前函数和它的使用函数。 (3) 选择:打印选择的程序行以及使用的函数 (4)外部函数:所有的外部函数 2. 函数属性 (1)打印函数 定义函数是否打印。 1)使用的本地函数:打印使用的本地程序函数。 2)所有本地函数:打印所有本地函数。 3)使用的外部函数:打印使用的外部函数。 4)函数接口:如果选中此复选框,只打印函数的接口,不打印函数体。 3. 锁定的函数无 法打印。 2.2.1.15 退出 功能:退出 HDevelop 快捷键:Ctrl+Q 2.2.2 编辑菜单 菜单如下图所示:

2.2.2.1 撤销 功能:撤销以前的编辑动作。 快捷键:Ctrl+Z 2.2.2.2 重做 功能:恢复撤销的操作。 快捷键:Ctrl+Y

2.2.2.3 剪切 功能:剪切选中的程序 快捷键:Ctrl+X 2.2.2.4 复制 功能:复制选中的程序。 快捷键:Ctrl+C 2.2.2.5 粘贴 功能:粘贴程序。 快捷键:Ctrl+V 2.2.2.6 删除 功能:删除在程序窗口中选中的程序。 快捷键:Del 2.2.2.7 激活 功能:激活选中的程序。 快捷键:F3 2.2.2.8 注销 功能:注销选中的程序。 快捷键:F4 2.2.2.9 查找/替代 功能:在当前的程序里查找/替代变量、算子或者文本。 快捷键:Ctrl+F

1. 查找/替换类型:变量、算子、文本 2. 查找范围: (1)所有 搜索主函数,所有本地函数和所有外部函数。 (2)程序 搜索的主函数和所有使用的函数。 (3)当前过程 只搜索当前函数。 (4)请注意,锁定的程序无法搜索。 3. 查找选项 (1)事件敏感度: 是否区分大小写。 (2)全字符 精确匹配全字符。 (3)向后 向后搜索。 4. 查找文字的单一匹配项 先输入查找文字,然后单击查找。如果没有与之匹配的文字,则文本框会立刻闪烁。如果 有,当前程序中第一个文字匹配的程序行会突出显示。以后每次点击查找会突显下一个文 字匹配的程序行。如果当前范围的最后一个匹配项已经达到,该文本段落会立刻闪烁。接 下来点击查找会从头开始查找。 5. 查找文字的所有匹配项 输入搜索文字,然后单击查找所有。搜索结果将显示在一个单独的窗口,即程序行视图窗 口。 在程序行视图选择一栏程序行。如果选择的程序行的函数已在程序窗口中运行,那么

程序窗口会显示该程序行;如果选择的程序行的函数没有运行,那么会程序窗口会自动切 换到该函数,并显示该程序行。 可以通过按住 <Ctrl>键 ,从搜索结果中选中多行 ,选中后可以从搜索结果的右键菜单进行下 列操作:

书签 : 把选定的程序行添加到书签。这一操作会将选择的程序行添加到书签中。这种方式可以 “记住”搜索结果,方便以后使用,只需再次打开该程序行视图窗口(窗口=>程序行视图) , 然后转到标签页的书签。 5. 替换变量名 单击“变量”来指定搜索上下文,然后输入搜索文字和替换文字。单击查找,直到找到所 需的行。随后,单击“替换”按钮。下一个匹配行会自动突出显示。也可以单击“全部替 换” ,替换在指定的范围内搜索到的所有匹配项。 6. 替换算子或函数 可以替换一个算子或一个函数。 点击“算子”指定搜索范围。输入源算子或函数名,目标算子或函数名称。当两个名字设 置好时,目标算子/函数的参数显示对话框的底部的“参数替换计划” ,如下图所示。对应于 每一个目标参数,必须选择或输入相应的源参数。

请注意,该选项“全字符”在此模式下始终处于启用状态,因为替换算子操作只有在完全 匹配的情况下才能进行。 2.2.2.10 重复查找 功能:根据最后输入的查找字符来查找下一个匹配的字符。 快捷键:Ctrl+G 2.2.2.11 设置/清除书签 功能:设置/清除选定程序行的书签 快捷键:Ctrl+F11 当编写大型程序或程序使用很多算子时,书签功能可以给用户带来很大的方便。设置好书 签后,可以在书签之间来回跳转,或从程序行视图窗口管理书签。书签所在的程序行由一 个星形图标在

程序窗口的左栏中标注的。书签是暂时的,不能保存。 2.2.2.12 下一个书签 功能:跳转到下一个书签所在的程序行。 快捷键:F11 2.2.2.13 前一个书签 功能:跳转到前一个书签所在的程序行。 快捷键:Shift+F11 2.2.2.14 书签... 功能:管理程序行的书签

该程序行视图窗口包含了一个标签页来管理您的书签和导航到书签的程序行。 标签页列出了当前书签的所有程序行。点击活动程序窗口中一栏,跳转到相应的程序行。 如果你的程序中包含许多书签,你可以通过反复使用<F11>和<Shift+F11>在书签之间跳转。 清除所选程序行的书签,并立即从列表中删除相应项。这个动作也可以从右键菜单来触发, 或按<Del>键完成。 清除所有的书签,并从列表中删除所有项,留下一个空窗口。 2.2.2.15 无效行... 功能: 管理无效的程序行

程序行视图窗口包含了一个标签页来管理的无效程序行。无效行是指未解决的函数调用,

算子或函数包含了一个错误的参数数值或参数类型,或语法错误。标签页列出了所有无效 的程序行。如果修改了程序,而无效行窗口还是打开的,那么需要点击“刷新”按钮。 使 用右键菜单,你可以对所选择的程序行以下操作:

2.2.2.16 参数选择... 功能:设置 HDevelop 的全局参数。 1. HDevelop 可以设置用户接口、外部函数、一般属性、可视化设置、运行时设置的参数。

更改此对话框中的任何设置会自动保存,无须用户管理。生成参数配置文件的位置取决于 操作系统: Windows: %APPDATA%\MVTec\HDevelop.ini (文件位置) UNIX: $HOME/.hdevelop/MVTec/HDevelop.ini (文件位置)

(1)导入 使用这个菜单项可以导入用户以前保存的参数配置(扩展名: .hdp) ,使用复选框可以指定 导入哪些参数:

(2)导出 使用这个菜单项可以导出用户以前保存的参数配置(扩展名.hdp) ,使用复选框可以指定导 出哪些参数:

(3)复位 选择该菜单项重置所有参数(除了窗口的尺寸和布局)为默认设置。如果要重置窗口的尺 寸,可以使用下面的命令行来打开 HDevelop 开关: hdevelop ‐reset_preferences 在对话框左边是参数类别列表,右边是该类别相关参数的标签页列表。在下面详细介绍这 些参数类别。

1.字体 指定用于在程序窗口的字体。 Indent Size: 缩进大小,表示程序窗口的程序行缩进时用到的空格的数目。在 HDevelop,循环体和条件 表达式是自动缩进的。 2. 彩色 在程序窗口指定用于语法高亮显示的颜色。您可以选择预定义的颜色方案中的一种,或通 过点击颜色的按钮自己选择。用户改变颜色后,Hdevelop 会自动切换到 User defined 的颜 色方案。 3.编辑器设置: HDevelop 支持两种方法来编辑程序: (1)基于对话框的编辑器 基于对话框的编辑模式,在这种模式下,双击在程序窗口的程序行,当算子窗口没关闭时, 在算子窗口中编辑。 (2)全文编辑器 选择全文编辑器。在这种模式下,可以在程序窗口程序行自由的编辑。在程序窗口双击程 序行,当算子窗口没关闭时,可以在算子窗口中编辑。这样一来,全文编辑器可以在与传 统的基于对话框的编辑模式一起使用。 4. 工具提示模式: 在默认情况下,当鼠标光标停留在一个程序行,会显示提示信息。当放置在一个算子名上, 则显示相应的算子接口和一个简单的描述。当放置在一个图形变量上,显示一个图标。当 放置在程序行列,可能会出现警告信息,例如,如果使用的算子已经过时了。如果它扰乱 你的编程,可以关闭他。 (1)所有

当鼠标光标停留在一个程序行时,总是显示提示信息。 (2)仅在控制键 仅当<Ctrl>键被按下时才显示提示信息 5. 如果全文编辑器被选中时,可以通过下列选项来调整它的操作: 自动完成 在全文编辑器中使用高级的自动补偿功能。 此功能在后续章节 “全文编辑器” 中详细介绍。 2.2.2.16.2 用户接口=>字体 在此标签页中,可以修改 HDevelop 的字体: 1. 一般 整个用户界面中使用的字体(菜单项,标签等) 2. 帮助窗口 在帮助窗口中使用的正文字体(菜单 帮助=>帮助) 3. 程序列表 在程序窗口中使用的字体。这和“程序列表”标签设置相同的字体(见上文) 。 4. 高级的自动补全功能 高级的自动补全功能使用的字体。 5. 值和参数 用于变量窗口和相关检查窗口显示值,以及算子窗口中的显示参数的字体。 6. 打印 打印程序列表时使用的字体。 2.2.2.16.3 用户接口=>语言 在此标签页中,您可以更改用户界面的语言。请注意,如果选择不同的语言 HDevelop 需要 重新启动。默认情况下,HDevelop 使用操作系统区域设置中指定的语言。为此,环境变量 LANG,LC_ALL,LC_CTYPE 和 LC_COLLATE 按顺序进行测试。一旦语言在此对话框 中改变,操作系统的区域设置将被忽略。 2.2.2.16.4 用户接口=>布局 1.在主窗口标题栏中显示完整路径: 勾选,表示在 HDevelop 窗口的标题栏显示前程序的完整路径;不勾选,仅显示文件名。 2. 排列窗口为默认方式: 定义使用 窗口=>排列窗口 时,HDevelop 的四个主要窗口的平铺布局 2.2.2.16.4 用户接口=>布局 1.在主窗口标题栏中显示完整路径: 勾选,表示在 HDevelop 窗口的标题栏显示前程序的完整路径;不勾选,仅显示文件名。 2. 排列窗口为默认方式: 定义使用 窗口=>排列窗口 时,HDevelop 的四个主要窗口的平铺布局

1. 添加: 从文件选择对话框中选择一个目录。该目录将被添加到列表中。所选目录的所有子目录都 将被扫描好。 2. 删除: 从列表中删除所选的目录。使用该目录中的任何外部的函数的程序将不能运行。 3. 重新搜 索 当目录中的文件发生任何变更时,重新扫描所有列出的目录。 4.使用复选框可以暂时关闭相应的目录,不用从列表中移除它们。 5.目录可以使用向上/向下箭头按钮调整排序。 2.2.2.16.6 外部函数=>外部函数 此标签页列出所有外部函数,它们按照从配置目录加载的的顺序排列。对于每一个函数,将 显示以下信息:

列名 # 函数名称 状态

含义 外部函数的数量 外部函数的名称 已加载:外部程序已经加载成功。它可以在任何 HDevelop 程序中使用。 卸载:外部函数在加载时发生错误(例如:该文件的权限不对或外部的函数文 件已损坏) ,该函数会被卸载。 隐藏:从不同的目录加载的相同的名称的外部函数,该函数会被隐 搜索目录 搜索函数的目录 相对路径 外部过程相对于搜索目录的相对路径。 用作 使用的次数和函数的调用者的名 字。 更新的 函数加载之后更新的次数。 使用右键菜单,可以执行文件系统的基本操作。您可以在文件系统中复制,删除或重命名 选中的函数文件。 2.2.2.16.7 外部函数 => 管理密码 利用这些选项,你可以方便的管理所有函数(本地的和外部的)的状态和密码。函数分成 三种类别(从左到右) :没有密码的函数(未保护的函数) ,已经输入密码的加密函数(未 锁的保护函数) ,用密码锁定的函数(加锁的保护函数) 。

利用各栏框之间的箭头按钮或者用鼠标左右拖动,你可以把选择的函数移动到不同的状态。 如果你把第一栏的函数移动到第二栏,一个密码窗口就会显示出来。所有选择的函数使用 相同的密码。如果你将第二栏的函数移动到第三栏,相应的函数会被加锁,也就是,函数 的接口不能编辑以及函数体不显示,只有输入正确的密码才能访问。如果函数移动到中间 的那栏,并输入密码,可以访问加密的函数的内容,也可以通过程序窗口来解锁函数。如 果你选择多个函数从第三栏向左移动,需要输入密码来进行解锁。只有密码正确这些函数 才能移动(解锁) 。这样,你可以通过一个密码来管理一组函数。如果在中间那栏选择有一 个或者多个函数,点击“修改密码”按钮,可以给这些函数设置一个新密码。 请注意,改变密码或者从第一栏移动(移出或移入)函数时,需要保存函数。可以参见“保 存”和“全部保存”功能。 2.2.2.16.8 外部函数=>函数使用 这个标签页列出了加载的函数组。可以选择过一个程函数以及使用的函数的类型(无论是

本地还是外部) 。对于主函数,还可以列出未使用的函数。这个标签页如下图所示:

2.2.2.16.9 外部函数=>未实现的函数调用 这个标签页帮你在当前程序中找到未实现的函数。如果当前程序或者加载的函数包含未实 现的函数调用,它们会在这个列表中显示调用函数的名字。 2.2.2.16.10 一般属性=>一般选项 如下图所示:

1. 请选择在算子窗口或全文编辑器中按下回车键的行为 这个选项可以在程序窗口设置 (1)确定(输入并执行) 在程序窗口中输入算子并执行。 (2)输入 在程序窗口中输入算子但并不执行。 2. 显示字符串的值时带特殊符号引用

在变量窗口和变量检测窗口中,需要对特殊符号(比如\n,换行符)解析。如果勾选,特殊 符号会逐个显示,就像他们输入时一样(换行符输入\n,那么在变量窗口和变量检测窗口中 也是显示为\n) 。 3. 显示实型值的精度 设置显示实型数据的小数的位数。 4.显示鼠标位置值的精度 如果设置的精度大于 0,可以得到鼠标亚像素位置。 5.在适当时返回相对文件路径 如果开启,HDevelop 会把从选择文件对话框获取的包含全路径信息的文件名转化为包含相 对路径信息的文件名。HALCON 的某些算子使用一些可区分的目录作为优先搜索目录。例 如,read_image 算子首先在路径%HALCONROOT%/images 查找图像。如果图像不存在, HDevelop 会在当前工作目录下查找。如果没有相关路径可以创建,那么 HDevelop 会使用 绝对路径。 6.当前程序的文件数量 显示在菜单 文件=>当前程序 的文件的数量。 7.显示最近使用的程序文件 如果选择“可用的” , “当前程序”列表显示当前可用的程序。如果选择“所有” , “当前程 序” 列表也可以包含来自网络驱动器的文件。 8.在执行程序之前自动保存程序和外部函数 如果这个选项被启用,你点击任何的执行按钮(如运行或单步跳过) ,程序会在执行之前会 自动保存当前程序和外部函数未保存的更改。 9.为保存 HDevelop 程序和过程编码 HDevelop 可以用两种不同的编码方式保存程序和函数。在加载时,HDevelop 自动检测所 使用的编码方式。如果该程序包含超过 ASCII 国际标准字符 , 推荐使用 UTF ‐ 8 编码 (Unicode) 。为了加载旧版本 HDevelop 程序,必须设置编码为 Native。 10.保存 HDevelop 程序的默认文件格式 设置新程序的默认文件格式. 11.保存 HDevelop 函数的默认文件格式 设置新的外部函数的默认文件格式。 2.2.2.16.11 一般属性=>高级用户 如下图所示:

1.显示 HALCON 底层错误对话框

如果发生 halcon 底层错误,将在消息对话框显示该错误。在输出控制台中 halcon 底层错误 日志不受此设置影响。 2.在 try‐catch 程序段内抑制错误对话框弹出 如果在 try‐catch 代码段中出现异常将不打开错误信息对话框, 而是直接抛出 HDevelop 异 常。 3.不被对 dev‐算子替换掉的 HALCON 算子产生警告 抑制那些被 dev_算子替代的 halcon 算子的警告。 4.取消检测采集算子的参数 使采集算子的自动参数检测功能失效。使用错误的参数可能导致程序崩溃。 5.忽略语意类型 忽略变量类型对参数建议的影响。在算子窗口和全文编辑器中提示参数建议时将包含类型 不合适的变量名。 6.显示内存占用 在状态栏中显示上一个执行的 halcon 算子所占用的内存资源。 这个可能会影响 halcon 的性 能。 7.在 HDevelop 程序中抑制校验和 在 HDevelop 程序中抑制校验和避免在版本控制系统中冲突。 这个选项选中的情况下保存的 文件将不能用在 HDevelop Demo 程序中打开!这个选项仅仅影响与 HDevelop 10.0 对于的 文件格式。

2.2.6.1 控制 功能:选择控制流算子。 在这里,可以选择程序的控制结构。控制结构算子主要包括以下部分: (1)条件判断: if,ifelse 和 elseif (2)循环结构:for, while,和 repeat 循环结构控制:break, continue (3)异常处理:try, catch,endtry 和 throw (4)在任意位置停止程序:stop (5)终止并退出 Hdevelop:exit (6)对控制数据赋值:assign,insert (7)对程序进行注释:comment (8)在导出的 halcon 程序中嵌入任意文字:export_def 在 HDevelop 中用 export_def 输入注释, 在把 HDevelop 程序导出到另一种编程语言时注释符 号丢失,只保留注释部分的文字。例如: 1)在 HDevelop 用算子窗口输入注释,然后点击输入:

(9)其他算子参看后文。 2.2.6.2 开发 功能:选择 HDevelop 专用算子。 这个菜单包含多个改变用户界面的算子,它们用来在程序中设置环境的。使用这些算子,可 以在程序中进行这些操作:设置参数窗口的颜色,在菜单栏打开一个窗口,或者在窗口管理 器的帮助下把编程窗口图标化等。这个菜单中的所用算子都以前缀 dev_开始,这样来与 HALCON 其他算子进行区分(例如,dev_set_color 和 set_color) 。 1.dev_open_window,dev_close_window,dev_clear_window

算子 dev_open_window 和 dev_close_window 分别用来打开和关闭一个图形窗口。打开时, 可以用来设定窗口的大小和位置。算子 dev_close_window 清除活动窗口的内容及其历史。 这相当于图形窗口中“清除”按钮的用法。请注意,dev_open_window 和 dev_close_window 不能用在 Visual Basic,Visual Basic.NET,和 C#,这些软件是使用 HWindowXCtrl 控件的。 2. dev_set_window_extents 用来设置活动的 HDevelop 图形窗口的大小和位置。 3. dev_set_window 这个算子根据窗口句柄激活相应的图形窗口。这个窗口句柄是 dev_open_window 的输出参 数。执行后,输出图形显示在该窗口。 4. dev_set_color, dev_set_colored dev_set_color 与菜单项“可视化=>颜色”作用相同,用指定颜色显示 regions,XLDS 和文本 dev_set_colored 与菜单项“可视化=>彩色数量” 作用相同,设置图形窗口中显示图形变量 的彩色数量。通过多种颜色来区分不同的 region 和 XLD。 5. dev_set_draw 与菜单项“可视化=>画”作用相同,设置区域的填充模式。 6.dev_set_line_width 与菜单项“可视化=>线宽”作用相同,设置活动图形窗口上显示的线(XLD,region 的边界, 或其他类型的线)的宽度。 7. dev_set_lut 与菜单项“可视化=>查找表”作用相同,指定查找表,用于灰度值映射。 8. dev_set_paint 与菜单项“可视化=>打印”作用相同,指定图像可视化模式。可以看菜单项“可视化=>打 印” (第 190 页)了解。如果你想为选择的打印模式设置所有的参数,要把打印模式和参数 依次拼接到一个 tuple 元组。paint 类似于 halcon 算子 set_paint。 9. dev_set_shape 与菜单项“可视化=>形状”作用相同,区域显示的形状。 10. dev_set_part 这个算子调整 image, region, XLD 和其它图形的输出范围。 选取图像一个左上角点坐标和一 个右下角点坐标,这 2 个点产生一个矩形区域,在图形窗口中显示这个矩形区域内的图形。 11. dev_display 图形变量是通过这个算子显示在活动的图形窗口的。当自动输出被抑制时(见下面的 dev_update_window 和菜单“编辑=>参数选择=>运行时设置=>运行设置” ,可以使用这个算 子来输出图形变量。 12. dev_clear_obj 这个算子清除指定的图形变量。在变量窗口,这个图形变量显示为未定义状态(以一个?作 为图标) 。 13. dev_inspect_ctrl 这个算子用来打开变量监视窗口。如果需要同时检测多个变量,需要把变量名拼接为一个 tuple 元组,如:dev_inspect_ctrl([Area,Column,Row])。 14. dev_close_inspect_ctrl 这个算子用来关闭变量监视窗口。 15. dev_map_par, dev_unmap_par

这两个算子打开/关闭设置参数对话框,也可以通过菜单项“可视化=>设置参数”打开。 16. dev_map_var, dev_unmap_var dev_unmap_var 把变量窗口最小化。 dev_map_var 把变量窗口恢复成正常大小。 17. dev_map_prog, dev_unmap_prog dev_unmap_prog 把编程窗口最小化。 dev_map_prog 把编程窗口恢复成正常大小。 18. dev_update_window, dev_update_var, dev_update_time, dev_update_pc 使用这些算子,您可以在运行时配置输出。这些算子相当于菜单项“编辑=>参数选择=>运 行时设置=>运行设置”的设置。 dev_update_window 指定在 HALCON 算子执行后图形数据在图形窗口中是否自动更新。 dev_update_var 指定在一个程序的执行时,每个变量(图形和控制)在变量窗口是否自动更 新。 dev_update_time 表示程序执行停止时,控制是否显最后一个算子或过程调用的执行时 间。 dev_update_pc 表示在运行程序时,是否显示当前位置(即运行到程序哪一行) 。 19. dev_set_check 这个算子等价于 HALCON 算子 set_check。它用来处理在 HDevelop 中运行 HALCON 算子 时 发 生 的 运 行 时 错 误 。 参 数 值 为 'give_error'( 默 认 值 ) 时 , 如 果 算 子 的 返 回 值 不 是 H_MSG_TRUE,那么它将中止程序并弹出一个错误窗口。参数值是'~give_error',会忽略错 误信息或者其它信息,继续执行程序。这个算子可以和类似于 get_mposition, file_exists, read_image, 或 test_region_point 等会返回 H_MSG_FAIL 的算子一起使用,通过算子返回值 来判断算子是否有效执行。 20. dev_error_var 这个算子指定了变量,用来存储算子执行后返回的包含错误代码的返回值。dev_error_var 一般都与 dev_set_check 一起使用。由于在 HDevelop 的函数中只允许使用本地变量(局部 变量) ,因而 dev_error_var 指定的变量只在函数内部有效。dev_error_var 与 dev_set_check 一起使用的例子可以观看程序: %HALCONEXAMPLES%\hdevelop\Graphics\Mouse\get_mposition.dev. 2.2.6.3 1D Measuring, 3D Measuring, 3D Reconstruction, ... 功能: 选择 HALCON 算子。 在这些菜单项中,列出了所有 HALCON 算子,这些算子根据专题和功能按章节进行分类。 HALCON 算子用来实现各种不同的图像分析任务,如预处理、滤波、和测量。可以在 HALCON 参考手册中找到每个算子的详细描述。在菜单项“控制”和“开发”中的算子是 HDevelop 中的专用算子,在 HALCON / C,HALCON / C + +,或 HALCON / COM 的参考 手册中没有。 根据 HALCON 参考手册的章节结构,菜单上有一个级联结构。这个菜单项是 HDevelop 启 动后动态创建的,创建可能需要花一些时间,创建后才能使用。选择一个菜单项可打开相应 的章节或算子。选中一个算子时,在左下角状态栏有该算子的简短描述。 注 意 , 一 些 算 子 在 菜 单 中 可 见 但 是 不 能 使 用 , 例 如 open_window ( 在 菜 单 项 “ 算 子 =>Graphics=>Window”中)或 reset_obj_db(在菜单项“算子=>System=>Database”中) 。如 果你选择了一个这样的算子, 那么在算子窗口中会显示一个警告文本。 这个警告通常会提示 一个合法的代替算子。在大多数情况下,应该使用 HDevelop 的开发算子(例如,用 dev_open_window 替换 open_window) 。 2.2.6.4 过程 功能:选择函数。

这个菜单列出了所有的内部和外部过程,这些过程按照章节分类好,放在子菜单中。如果一 个过程没有与之相关的分类信息, 它将直接显示在子菜单里。 选定一个过程后将进入算子窗 口进行编辑。 2.2.7 建议菜单 功能:让 HDevelop 根据当前算子提示建议算子。 这个菜单项提供了另一种方法来选择 HALCON 算子。假定已经选择了一个算子,根据这一 算子,HDevelop 提供五种建议:

2.2.7.1 前趋函数 许多算子需要一个合理的或必要的前趋算子。例如,在计算骨架的节点之前 ( 使用算子 junctions_skeleton) , 需 要 先 计 算 出 骨 架 ( 使 用 算 子 skeleton ) 。要执行动态阈值分割 (dyn_threshold)获得一个阈值图像, 一般会先进行低通滤波。 要使用分水岭算法 (watersheds), 一般会先进行平滑滤波,因为这会大大减少运行时间。 2.2.7.2 后继函数 在许多情况下,由任务引出后继的算子序列。例如,在执行边缘滤波后,要进行阈值化,或 者在分割之后要执行区域处理(例如,形态学算子) 。为了帮助后继合理的处理,在菜单项 里列出了所有可能的后继算子。 2.2.7.3 替代函数 由于 HALCON 里面有诸多算子,并且很多算子功能相近,这个菜单项提示了可供替代的算 子。 例如, 如果使用的是 mean_image 算子, 可用 gauss_image, sigma_image, 或 smooth_image 等算子替换。 2.2.7.4 参考 与“替代函数”相反,这里提供的算子与当前算子都有一些关联,这些参考算子提示了一些 与当前算子不同的方法来解决问题。 2.2.7.5 关键字 这个菜单项可以通过关键字访问与之相关的 HALCON 算子。点击菜单后,打开 HDevelop 在线帮助窗口的索引选项。 2.2.8 助手菜单 提供了以下助手: Image Acquisition Assistant,图像采集助手,halcon 10 和 11 都有; Calibration Assistant,标 定助手, halcon 10 和 11 都有; Matching Assistant, 匹配助手, halcon 10 和 11 都有; Measure Assistant,测量助手,halcon 10 和 11 都有; OCR Assitant,OCR 助手,halcon 11 有。 2.2.9 窗口菜单 这个菜单项用于管理主窗口下的子窗口,例如,程序窗口,算子窗口,变量窗口,图形窗口 和其它窗口。在这个菜单的底部列出了所有打开的窗口,点击其中一个窗口,然后相应的窗 口会显示最前面。菜单如下图所示:

2.2.9.1 打开图形窗口 功能: 打开一个新的图形窗口。 参见:dev_open_window 如果没有图形窗口打开,双击一个图标变量也可以打开一个新的图形窗口。 2.2.9.2 打开程序列表 功能:打开一个新的程序窗口。 参见:dev_map_prog. 2.2.9.3 打开变量窗口 功能:打开变量窗口。 参见:dev_map_var 如果变量窗口已打开,这个菜单项会变灰。 2.2.9.4 打开算子窗口 功能:打开算子窗口。 如果算子已打开,这个菜单项会变灰。如果没有使用全文编辑器,你也可以通过在程序窗口 中双击程序行来打开算子窗口。 2.2.9.5 打开输出控制台 功能:打开输出控制台窗口。 输出控制台窗口记录了最新的消息日志,包含了在状态栏显示的信息以及 HALCON 底层错 误信息。因此,可以在不中断程序的情况下进行纪录 HALCON 底层错误信息。这个窗口同 样可以通过双击状态栏中的信息区域打开。窗口如下图所示:

1. 日志信息是分类的,某一类的信息显示与否可以通过点击工具栏的相应图标设定。可以

分为以下几类: 程序执行信息。 文件操作信息事件。 程序执行警告事件。 文件操作警告事件。 HALCON 底层错误事件。 无效代码行事件。 程序运行错误信息。 HALCON 运行错误 事件。 异常事件。 2. 工具栏包含以下功能按钮: 清除,清除输出控制台。 导出,把日志信息保存为一个带.txt 或.csv 扩展名的文件。 拷贝,复制选定的日志信息到系统剪切板。 参数,打开输出控制台参数窗口。你可以指定保持在控制台的日志信息的最大数目(即存 储事件的数目) 。和在输出控制台窗口的工具栏按钮功能一样,复选框可以开启/关闭相应类 别的事件。输出控制台参数窗口如下图所示:

2.2.9.6 打开程序行视图 功能:在程序行视图窗口管理程序行。 程序行视图窗口包含了拥有共同属性的程序行列表。 在程序行视图窗口选中一行, 会切换到 程序窗口中相应的函数所在的程序行。可以在程序行视图中进行这些操作:激活,使无效, 复制,剪切,或删除一条或多条选定的程序行。 程序行视图窗口如下所示:

程序行视图具有以下共同属性:

(1)无效行 提供无效的程序行列表。 (2)查找所有 提供匹配当前的“查找所有”操作的程序行列表。如果“查找/替换”对话框没打开,点击 “打开搜索/替换对话框”按钮。 (3)断点 提供用断点标记的程序行列表。 (4)书签 提供用书签标记的程序行列表。 2.2.9.7 排列窗口 功能:重新排列主窗口的窗口区域。 当选择此项,主窗口分为四个区:默认情况下,所有的图形窗口以层叠的形式分布在左上角 四分之一的区域, 算子窗口分布在右上角四分之一的区域, 变量窗口分布在左下角四分之一 的区域,程序窗口分布在右下角四分之一的区域。这个布局可以在“参数选择”进行调整。 其它的窗口一般都是以层叠的形式分布在主窗口的中央。 在这种布局下, 这四个最主要的窗 口可以在不重叠的情况下实现显示尺寸最大化。这也是 HDevelop 的默认布局。如果激活全 文本编辑器模式并且算子窗口处于关闭状态,程序窗口会拉伸并把算子窗口的位置占领。

2.2.9.8 层叠窗口 功能:HDevelop 将当前打开的窗口以层叠方式布局。 2.2.9.9 单文档/多文档 功能:切换单文档界面/多文档界面(默认) 。 2.2.10 帮助菜单 通过帮助菜单,可以查询 HALCON 的信息以及所有 HALCON 算子和 HDevelop 算子。 2.2.10.1 帮助 功能:打开在线帮助窗口。 快捷键:F1 帮助窗口可以提供访问 HDevelop 和 HALCON 的文档。特别地,完整的 HALCON 参考手册 对每个算子提供了详细的参考资料。 也可以点击算子窗口里面的帮助按钮获取当前算子相关 信息。

2.2.10.2 HALCON 参考手册 功能:在在线帮助窗口显示 HALCON 参考手册。 2.2.10.3 HDevelop Use’s Guide 功能:在在线帮助窗口显示 HDevelop 用户指南。 2.2.10.4 HDevelop 语言 功能:在在线帮助窗口显示 HDevelop 语言章节。 2.2.10.5 搜索文档 功能: 打开在线帮助窗口并显示搜索引擎, 在搜索栏输入关键字来搜索 HALCON 参考资料。 2.2.10.6 HALCON 新闻 功能:访问 HALCON 主页。 这个菜单项可以让你访问在 MVTec 的 WWW 服务器上关于 HALCON 的最新新闻,例如, 是否有新的扩展包,图像采集接口,或 HALCON 版本。 2.2.10.7 关于 功能:显示 HDevelop 版本和授权的主机的 ID。 此菜单项提供当前 HALCON 和 HDevelop 版本的信息。另外,它列出了许可证管理器检测 到的主机 ID(可以看安装向导来获得更多信息) 。 2.3 工具栏 工具栏上列出了常用功能的快捷键。 (略)

2.4 程序窗口 程序窗口显示的是单个函数的 HDevelop 程序代码。你可以同时打开多个程序窗口来观看不 同的函数或者同一个函数的不同部分(参看“窗口=>打开程序表” ) 。程序窗口支持多个选 项卡,用来快速的在函数之间进行切换。 1. 程序窗口分成三个部分: (1)程序的主要部分包含了当前 HDevelop 函数的程序代码。参看“程序编辑”部分。 (2)左边的一列显示了插入光标、行数、程序计数器、断点、书签和警告。如下图所示:

(3)顶部显示了从下拉列表中可供选择的函数。箭头按钮是为了方便显示浏览过的函数。 例如,当前函数是主函数,从下拉列表中选择了另一个函数,左向箭头按钮可以使你回到主 函数。 当进入了主函数, 右向箭头按钮向前移动, 并再次显示先前选择的函数。 如下图所示:

用函数列表右边的工具栏按钮可以编辑当前函数的接口、 文档, 可以修改函数的命名和类型, 还可以修改参数的数量。参看后文“函数的创建”部分的详细说明。其余工具栏按钮主要用 于编辑。

2.4.1 编辑程序 HDevelop 提供了两种互补的编辑模式。首先,有一个经典的基于对话框的编辑模式。在这 种模式下,程序行的编辑是在算子窗口中进行的。此外,还有一个有高级自动补全功能的全 文编辑模式。当开启此模式时,在程序窗口中可以直接修改程序代码。在程序窗口工具栏切 换编辑模式。也可以在参数设置中设置缺省的编辑模式(编辑=>参数选择=>用户接口=>程 序列表中设置) 。 下面介绍这两种编辑模式的不同之处。 2.4.1.1 对话框编辑器 1. 在这种模式下,程序窗口被用来显示程序行,但是不去修改它们,也不能通过直接修改 文本来改变程序主体。在 HDevelop 中编辑程序是在算子窗口中进行的(参看 “算子窗口” 部分) ,这样可以避免许多输入错误。 2. 每一行都是以一个算子或函数的名字开头的。如果有必要的话,可以在排版时将程序行 缩进以突出由控制结构创建的嵌套级。 在算子或者函数名字后面的括号中显示了参数, 参数 用逗号隔开。 3. 为了编辑一行程序,需要用鼠标左键双击程序行。在条件结构和循环结构 的情况下,必须选择有参数的算子行。例如,在一个 for...endfor 的循环中双击 for,在一个 repeat...until 循环中双击 until。一次只可以编辑一个算子或调用的函数。双击程序行后,请 注意下面的信息: (1) 程序行以一种倾斜的字体突出显示 。 作用是提示你正在变更当前的程序行而不是添加 一个新的程序行。 (2)程序行的算子或调用的函数在算子窗口中显示并且可以编辑。 (3)算子窗口的窗口标题清楚的表明你正在编辑当前的程序行。同时也显示函数的名字和 行数。 (4)在算子窗口中点击确定或替换后会替换源程序行,原来的程序行不再显示。 (5)算子窗口中如果程序行在要更改之前被删掉,编辑行会被作为一个新的程序行插入到 光标处。如果不确定当前的状态,你可以检查算子窗口的窗口标题。 4. 下图演示了编辑过程:

5. 复制、粘贴、删除功能 除了编辑一个算子或一个调用函数的参数以外, 用简单的鼠标功能可以一步实现一行或多行 算子的删除、剪切和粘贴。用鼠标在程序窗口中选择一行或多行算子: (1)你可以用点击来选择一行算子,会取消先前已经选择的算子行。 (2)如果要选择不止一行算子,按<Ctrl>键点击要追加的算子行。 (3)<Shift> 键的作用是通过鼠标点击选择连续数列的算子行:先前一次和最新一次选项 之间的所有的算子行会被选中。 (4)选择算子行之后,用菜单中的编辑菜单或工具栏或经由程序窗口中的鼠标右键菜单可 以激活编辑功能。 2.4.1.2 全文编辑器 1. 全文编辑器可以自由的进行文本编辑。可以在程序窗口中点击来放置光标,然后在光标 处输入文字。可以用鼠标选择一部分文本,并用后来输入或粘贴的文本代替选择的部分,用 这种方法修改参数的值,要比用对话框编辑器快得多。 2. 下面两种赋值方式是等价的,这两种方式都可以在全文编辑器中使用,但是第一种方式 更具可读性: FileName := 'image1' assign('image1', FileName) 3. 下面两种对 tuple 元组元素赋值方式是等价的,这两种方式都可以在全文编辑器中使用, 但是第一种方式可读性更好: Image[10] := 'image2' insert(Image, 'image2', 10, Image) 4. for 循环必须按照下面的格式输入: for Index := 1 to 10 by 1 ... endfor 5. 续行 和对话框编辑器不同,为了提高程序的可读性,可以把一行程序间隔成几行,把一个反斜杠 字符作为每行(除了最后一行)的最后一个字符。 例如,在全文编辑器可以输入: disp_arrow (WindowID, \ Row[i], \ Column[i], \ Row[i]‐Length*sin(Phi[i]), \ Column[i]+Length*cos(Phi[i]), \ 4) 在对话框编辑器中是: disp_arrow (WindowID, Row[i], Column[i], Row[i] ‐ Length*sin(Phi[i]),

Column[i]+Length*cos(Phi[i]),4) 如果转换到对话框编辑器, 这些间隔的行会重新连接起来变成一行。 只要一转换回全文编辑 器,这一行会恢复成间隔的多行,除非相应的行已经在对话框编辑器上编辑过。 6. 自动缩进 通常,先前算子行会维持已有的缩进,新算子行会自动调整缩进。在算子的括号内部的把一 行分成多行, 新的一行缩进到左括号处排列。 如果算子行是一个控制结构 (例如 if 或 while) , 控件结果内部的程序行会根据 indent size(缩进量)自动缩进。indent size 在“编辑=>参数 选择=>程序列表”设置处详细说明,默认值是四个空格,如果控制结构关闭了(例如输入 endif 或 endwhile) ,当前命令行的缩进量按 indent size 减小,与控制结构的起始行对齐。 7. 高级的自动补全功能 全文编辑器提供了高级的自动补全功能来帮助快速、 正确的输入程序。 高级的自动补全功能 可以从程序窗口工具栏 切换开和关。 当你开始输入新的一行算子时,HDevelop 会提示一个匹配算子名字的列表:

注意算子行不完整时,会被作为无效行突出(默认用红色) 。 当你继续输入时列表会立即更 新:

此例中,列表中仅包含一个算子名,按<Tab>键来选择最长字符串。算子的输入全部完成了, 包含了调用算子的左括号:

一旦光标移动到括号内部, 提示列表从算子模式变成参数模式, 被选中的算子的名字显示出 来,光标所在位置的相应参数用粗体突显。 在这个列表中的第一个项是完成到右括号的完整的调用算子的一个建议, 剩余的项是调用算 子第一个参数的建议。此时可按<Tab>来选择第一个建议:

或者按<Up> 键或 <Down>键在建议列表中进行选择:

按<Tab> 键或 <Return>键来选择突出项,然后,输入一个逗号或者再次按<Tab> 键来获取 第二个参数的建议:

注意建议列表中的浏览按钮, 可以通过双击打开文件选择对话框来设置文件名参数, 也可以 直接选择一个建议的参数(每个参数代表了一个文件名),或者用户输入一个文件名。 此例 中,我们想要加载 clip 图像,建议列表中没有合适的,在单引号之间输入文件名('clip')并按 <Tab>键来完成参数输入,并自动插入右括号:

输入表达式时,高级的自动补全功能也提示符合 HDevelop 编程语言的操作建议:

请注意:高级自动补全功能不提示 legacy 或弃用的算子。如果你手动输入一个这样的算子, 会在左列显示一个警示的图标。 移动鼠标光标到这个图标上来获取提示工具和相应的警示信 息:

全文编辑器常用的快捷键: <F1> 打开当前程序行算子或调用的函数的参考文档 光标在程序行的开头:调整当前程序行的缩进量 <Tab> 选取文本:相应的代码行往前缩 进一级 <Shift>+<Tab> 选取文本:相应的代码行往后缩进一级 <Shift>+<Return> 与返回键作用相反(参看程序窗口工具栏) <Ctrl>+<Return> 执行当前程序行 <Ctrl>+<F> 打开查找/替换对话框,并把选取的文本作为关键字 高级的自动补全功能常用的快捷键: <Esc> 隐藏建议列表 <Ctrl>+<Space> 在光标位置或选项位置重新显示建议列表 <Up> 在建议列表中选择前一个项 <Down> 在建议列表中选择下一个项 算子建议:执行突出的建议或建议列表中最长的字符串 <Tab> 参数建议:执行突出的 建议或第一个建议(如果没有突出建议) 2.4.2 程序计数器、插入光标、断点 程序主体显示的左边一列包含了程序计数器(Program Counter ,缩写为 PC,一个绿色的箭 头指向程序行) ,插入光标(Insert Cursor,缩写为 IC,两个行程序之间的一个黑色三角形) 和断点(一个红色的停止标记) 。程序计数器所在行表示下一个要执行的算子或调用的函数

的程序行。插入光标表示要插入一个新的程序行的位置。断点表示程序要停止在哪行。 通 过在程序窗口的左列点击,可以放置或激活这三个标签(标签表示程序计数器、插入光标或 断点) 。在最左边的位置,可以放置断点;在中间位置可以放置程序计数器;最后在最右边 的位置可以放置插入光标。通过控制下面的键 +鼠标左键强制放置一个特定的标签: 长按 <Shift>键放置插入光标; 长按<Ctrl>键放置或删除一个断点; 同时长按 <Shift>+<Ctrl>放置程序计数器。 程序计数器只可以放在出现在调用堆栈中的函数的程序行中。 2.4.3 右键菜单 程序窗口点击鼠标右键,弹出一个右键菜单。此菜单包含部分编辑菜单(例如,复制和粘贴 程序行) 、执行菜单(例如激活和注销程序行或设置和清除断点)的功能的快捷键。请注意: 通过右键菜单进行操作与通过主菜单进行操作略有不同: 通过主菜单调用时, 只对程序中选 中的部分进行操作; 如果没有选中任何地方, 不进行操作。 与之相反, 通过右键菜单调用时, 没有在程序中选中任何一行,对右键点击的一行进行操作。右键菜单如下图所示:

1. 运行到这里 从程序计数器程序行执行到鼠标光标所在的程序行。 2. 帮助 如果鼠标光标所在程序行包含一个调用算子或过程,点击“帮助”打开在线帮助或者双击程 序行,然后在算子窗口中点击帮助的捷径键。 3. 显示函数 如果鼠标光标所在的程序行包含一个调用的函数, 把相应的函数会变成当前函数, 也就是显 示出来以便于编辑。 4. 在新的标签页中显示函数

如果鼠标光标所在的程序行包含调用函数, 当前函数会作为一个新的标签页在当前程序窗口 中显示,如果相应的函数选项页已经存在,它会被激活。 5. 在新窗口中显示函数 如果鼠标光标所在的程序行包含调用函数,相应的函数会在一个新的程序窗口中显示。 6. 显示调用者 这个菜单项列出了当前选中的函数在当前程序中所有调用的程序行。 点击一项会切换到相应 的程序行。 7. 剪切 / 拷贝 / 粘贴 / 删除 / 激活 / 使无效 这些项用于对选中的程序行(对话框编辑器)或选中的文本(全文编辑器)进行操作。 8. 使用自动缩进 如果开启了全文编辑器,所有被选中的程序行的缩进方式与对话框编辑器的缩进方式相同: 嵌套的程序模块用一定数量的空格(在“编辑=>参数选择?=>用户接口”设置)来缩进。 9. 创建新函数 参看“过程=>创建新过程” 。 10. 设置程序计数器/设置插入光标 用右键菜单在程序行设置程序计数或插入光标。 11. 更新程序计数器 参看“编辑=>参数选择?=>运行时设置” 。 12. 设置/清除标签 参看“执行=>设置/清除标签” 。 13. 设置/清除断点 参看“执行=>设置/清除断点” 。 14. 激活断点/使断点无效 参看“执行=>激活断点/使断点无效” 。 15. 清除所有断点 参看“执行=>清除所有断点” 。 16. 打印... 参看“文件=>打印?” 2.4.4 创建函数 函数可以从头创建或者在当前函数中选择程序行来创建。 当开始一个新的 HDevelop 程序时, 只有一个主函数。 随着程序代码的增加, 时常发现一大块代码重复使用或者构成一个功能单 元,这种情况下,可以把相应的程序行放进一个新的函数中。 以下面的程序为例:

选择要创建函数的程序行,点击菜单栏“过程? 创建新过程”或者在程序窗口的右键菜单 选择“创建新函数” ,接下来就可以使用创建函数对话框创建新函数了。 2.4.4.1 设置函数属性 参看:过程? 创建新过程/ 编辑接口 创建函数对话框如下图所示:

1. 函数名称 新的函数需要有一个唯一名称,这个名称可以由字符(由字母、数字构成)和下划线组成, 它必须以一个字母开头。如果输入一个无效的名称,例如,已使用的名称或者包含无效的字 符,文本框会突出显示:

如果使用一个无效的名称,将不能关闭对话框,也无法使更改生效。由于算子和函数以相同

的方式调用,函数名称不能与算子名称相同。 2. 类型 这个复选框决定新的函数是本地函数还是外部函数。本地函数保存在 HDevelop 程序内,而 外部函数作为单独的文件保存。外部函数可以在其他的 HDevelop 程序中使用。用户可以随 时更改函数的类型。 3. 目录(外部函数有效) 默认是创建本地函数。如果要创建一个外部函数,要取消勾选“本地”复选框。取消后,要 为外部函数指定一个保存目录:

外部过程参数设置的第一个目录作为默认目录(在“过程=>外部过程设置=>外部函数=>目 录”中设置) 。可以在目录列表选择一个合适的目录,或者点击浏览按钮来选择一个任意的 目 录; 在关闭 对话 框并使 更改 生效时 ,如果 新目 录不 是预先 配置好 的目 录的 子目录 (HDevelop 会自动的搜索子目录) ,新目录添加到目录列表。 可以从函数名称旁边的下拉列表选择外部函数的文件格式(扩展名) 。已经存在外部函数的 目录和文件格式不能在这个对话框中被修改,可以通过菜单“文件=>将函数另存为...”修改 或者用文件管理器重新放置函数。 4. 密码 可以有选择的通过设置密码保护函数。受保护的函数可以不受限制的在 HDevelop 程序中使 用,但查看和修改这些函数需要提供正确的密码。 5. 替代选中的程序行 如果此项被激活,已选中的程序行将会被新创建的函数代替;如果不激活,原来的程序行会 保持原来的状态。无论此项是否被激活,新的函数的主体都是选中的程序行。 2.4.4.2 设置函数参数 1. 这部分对话框用于定义函数的参数。 像上文提到的一样, HDevelop 函数接口与 HALCON 算子接口具有相同的结构,即含输入图形、输出图形、输入控制和输出控制这四类参数。函 数接口对话框包含四个单独的区域, 在这些区域中可以编辑参数, 每个区域包含一个用于向 参数列表追加新的参数的按钮 ,如下图所示:

2. 选择程序行创建一个新的函数时,HDevelop 根据变量在代码中的用法,自动为函数创建 合适的接口参数。 “选中方案”选项决定了函数参数的建议。选项的意义如下:

(1) Only In 在已选择的程序行, 一个变量首次使用是作为一个输入变量, 它会被建议作为函数的一个输 入参数。 (2) Only Out 在已选择的程序行, 一个变量的最后一次使用是作为一个输出变量, 它会被建议作为函数的 一个输出参数。 (3) All In 在已选择的程序行,所有的输入变量被建议作为函数的输入参数。 (4)All Out 在已选择的程序行,所有的输出变量被建议作为函数的输出参数。 已选择的程序行中的变量是按图形变量和控制变量进行分类的。 如果一个变量既是输入变量 又是输出变量,它被分到第一类,也就是,相应的函数的参数作为一个输入参数。根据上面 的规则,如果一个变量的名称既可以作为输入参数又可以作为输出参数。作为输入参数,它 是函数的一个输入参数,输入参数名保持原变量名不变;作为输出参数,会在原有变量名后 面加一个“Out” ,作为输出参数名。 3. 实例创建一个新的函数 (1) 把下面已选择的程序行作为一个新的函数: threshold(Image, Region, MinGray, MaxGray) connection(Region, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', MinArea, MaxArea) (2)函数名称取名为“blob” ,方案中选择“Only In,Only Out” ,然后点击“应用” ,生成新 的函数,函数体如下:

选中的程序行用函数 blob 代替。 4. 参数列表的右边,提供了下列的按钮: (1)重置 如果你正在创建一个新函数, 点击这个按钮删除所有的已输入的参数。 如果你正在编辑一个 现有函数,点击这个按钮消除参数的任何改变,恢复原有参数。 (2)移除

用此按钮你可以从列表中移除一个参数。 移除前, 需要通过点击它的文本框来聚焦在相应的 参数上。 (3)上移/下移 用这些按钮你可以更改参数的顺序。 通过点击相应的文本框选择一个参数, 可用按钮更改参 数的位置。 2.4.4.3 提交函数接口 用于提交函数接口的按钮如下:

(1)确定 点击“确定“按钮,可以创建一个新的函数或更改已存在函数的接口 (2)取消 此按钮取消对函数的任何更改。 (3)应用 应用对话框中的更改而不关闭对话框。 (4)帮助 显示当前函数的在线帮助。 算子窗口中最新定义的函数可以马上使用。用于确定函数接口参数的变量,被用作调用函 数的输入参数。请注意,在函数主体的结尾调用 return。如果从头创建一个函数,那么新 创建的函数主体只包含 return 算子。产生的新的函数如下所示:

2.4.5 编辑函数 在每个算子窗口顶部的组合框显示了当前函数的名称。从组合框中,用户可以选择所有可 用的函数。 列表的第一个元素通常是主程序,然后是当前程序的本地函数,再然后是可用的外部函数 按字母顺序排列。 函数可以通过设置密码进行加密保护,这些函数仍然可以从列表中选择,除非输入正确的 密码否则他们会保持锁定状态。如果函数被锁定,在程序窗口显示的是一个密码按钮而不 是函数主体。关于受保护的函数更多的信息,请参看 “受保护的函数”部分。 想要查看 并修改当前函数的接口,点击程序窗口顶部的

按钮(函数名称的右边) 。这个按钮执 行的操作与菜单项“过程?编辑接口...” 一样。编辑接口对话框如下图所示(a:主函数 b: 自定 义函数) :

使用对话框上面的按钮, 可以选择与当前函数有关系的数据: “接口” 按钮提供了函数名称、 类型和参数。更多信息请参看“设置函数属性”部分和“设置函数参数”部分。剩余的按 钮提供了通向当前函数文档的入口,在下文“函数文档”部分进行介绍。使用对话框底部 的箭头按钮,依次选择对话框中不同的标签页。 2.4.6 函数文档 HDevelop 可以在函数接口对话框中生成函数文档。由于函数像算子一样,所以可以使用相 同的文档接口。函数文档被无缝的集成到在线帮助系统。假如在算子窗口中选择一个函数, 点击帮助按钮,会在帮助窗口中进入到相应的界面。 函数的文档支持多种语言输入。用于显示在线帮助中的函数文档的语言取决于“编辑 =>参 数设置”中设置。 如果想用特定语言编辑函数文档,可以在“语言”下拉列表中选择。 2.4.6.1 一般文档 一般文档编辑对话框如下图所示:

1. Basics 函数可以通过库和章节进行分组。 (1)库 在函数的在线帮助中,库是处于内容层次结构的顶层元素。它可以用来给一组函数标 记供应商特定的标签。由 HALCON 提供的外部函数使用的库标签为 “MVTec Standard Procedures” 。 (2)章节 章节旁边的文本框是用来指定章节的,这样你的函数就可以在过程菜单和算子菜单底部的 列表中按主题分组。 (3)简短的描述 输入一个简短的描述。通常情况下,这应该是一个描述该函数作用的简单的语句。它出现 在该函数 的在线帮助的概述部分。 此外, 当从菜单中选择出该函数时, 简短描述就会显示在 HDevelop 的状态栏。 (4)详细的描述 输入关于函数的详细描述。段落之间用空行隔开。 2. 例程 这部分文档用于代码示例。可以是一些工作程序或者代码片段来举例说明该函数的用法。 3. 建议 在此选项卡中的第一个区域是用来关联该函数的关键字。在此区域输入以逗号分隔的关键 字列表。 此外,您可以指定建议的后继函数、前趋函数,替代函数、参考函数。将以逗号 分隔的算子或函数名字的列表输入到这些区域里。这些区域的含义请参见“建议”菜单。 4. 高级 该选项卡中的文本框仅用于高级用法,我们建议搜索使用范例的在线参考手册。 (1)注意 使用该函数时的特别注意事项。

(2)复杂性 使用该函数时的复杂细节。 (3)警告 通常用来指示出陈旧或者过时的函数。警告文本应该注明相应的替代方案。 如果函数在算 子窗口中被选中,警告文字将显示为一个提醒。 (4)参考 推荐阅读的关于该函数的某些方面的参考书目。 2.4.6.2 参数文档 本节中的对话框为当前函数的所有参数提供了标签卡。该文档包括参数的详细规格和一个 简短的描述。该规格区域取决于参数类型(图形参数或控制参数)以及选择的语意。对话 框列出了最常见的图形参数和控制参数。 1. 图形参数文档 区域 含义 语意 指定参数的数据类 像素类型 只有当语意等于图像时才适用。列出了公认的像素类型。按钮“选择所有”选择 所有像素类型;按钮“None” 取消选择所有像素类型 多通道 只有当语意等于图像时才适用 错误: 只有这个图像的第一通道被处理。 正确: 这个输入必须是一个多通道的图像。 可选: 任意通道数的图像都可以作为输入。 多个值 错误: 输入只能是单个对象(不能是对象元组) 。 正确: 只可以输入对象元组。 可选: 输入可以是单个对象也可以是对象元组。 描述 图形参数的简短描述. 图形参数文档对话框如下图所示:

2. 控制参数文档 区域 含义 语意 指定参数的数据类。 对于某些语意类型,可以指定子类型. 类型列表 指定可接受的数据类型. 默认类型 指定默认的数据类型。 混合类型 错误: 元组中所有值的类型应该相同。 正确: 元组中的值可以是不同类型。 默 认值 HDevelop 建议的输入值。 值 建议值的以逗号分隔的列表。通过选择“排他性”来限制选取特定值。 最小值 数字控制数据的最小值。 通过选择“Enabled”来强制实行此设置。 最大值 数字控制数据的最大值。通过选择“Enabled”来强制实行此设置。

2.4.7 受保护的函数 函数可以通过一个密码进行保护。接口、文档和受保护函数主体只能在提供正确的密码情 况下才能访问。受保护函数可以被所有的用户使用(即调用) ,只有输入正确密码,才能查 看和修改函数主体。函数的状态可以通过函数接口对话框进行更改。想要同时管理多个过 程函数的状态,在“过程=>外部过程设置?=>外部函数=>密码管理”中进行。 1. 保护过 程函数 如果你想要用一个密码保护一个函数,按下面的操作: (1)在程序窗口中选择相应的函数。 (2)点击 来编辑已选择的函数接口。 (3)点击按钮 为函数设置一个密码。 (4)出现一个独立的窗口并且将新的密码正确的输入两次。如果两次输入了相同的密码, 点击“确定”即设定好了密码,如下图所示:

否则,会出现一个错误信息并且让你重新输入密码。当一个受保护函数最终保存时,是以 二进制的形式存储的。如果为主函数设置了一个密码,可以通过勾选“锁定整个程序,包 括所有本地函数”来使用相同的密码保护所有本地函数。如果个别的本地函数已经设置过 密码,那么当主函数的密码和这些本地函数密码一样时,才能锁定整个程序。否则,必须 在锁定整个程序前,删除本地函数的其他密码(与主函数密码不一样的密码) 。 重启 HDevelop 后,受保护函数才被锁定。编辑函数时,在程序窗口中选中此函数,一个相 应的消息会出现在程序窗口,如下图所示:

密码按钮显示在程序窗口。当输入正确的密码,函数将保持解锁状态,也就是说直到你关 闭 HDevelop 或再次手动的锁定,函数才会重新加锁保护。 2. 更改受保护函数的状态 为了更改受保护函数的状态,首先必须输入正确的密码来解锁此函数,然后用函数接口对 话框来更改密码或者删除密码。点击按钮 来更改状态,点击按钮后弹出对话框:

密码对话框按钮的作用: (1)锁定 可以锁定受保护函数,如果没有提供密码,当前程序不能访问函数主体。 (2)删除 删除密码。当函数保存后,不再受保护。 (3)新密码 显示密码窗口,设置新密码。 (4)取消 不改变密码状态。 3. 警告 当使用受保护函数时,要意识到密码不能重置,因此要非常小心,不要忘了密码!在一些 情况下,受保护函数与普通函数表现不同。由于受保护函数不能被非授权用户查看和修改, 它们也不能被复制、打印或者导出到任何编程语言中(然而,它们可以用“过程=>复制...” 来复制) 。此外,如果一个受保护函数 A 调用了另外一个函数 B,当函数 B 的接口发生变化 时,函数 A 因无法访问及无法修改代码,在函数 A 中调用的函数 B 保持变化前的接口,导 致调用函数 B 失效。 2.5 算子窗口 这个窗口用于显示、编辑算子或函数的参数。在算子窗口可以知道算子或函数的参数、参 数类型和参数值。

算子窗口由以下三个部分:

1. 在顶部可以输入算子或函数

2. 在菜单下面很大的区域是参数显示区域;用于编辑算子和函数的参数

3.在底部的控制按钮 2.5.1 输入算子或函数 在输入算子或函数区域可以通过输入全部或部分算子名或函数名来进行查询。 例如:输入 gen_c 然后按下回车键:

系统寻找所有包含了关键字 gen_c 的算子或函数,然后选择需要的算子或函数:

2.5.2 参数 参数是算子窗口的主要部分。Hdevelop 参数分为 4 种:输入图形参数、输入控制参数、输

出图形参数、输出控制参数。 如果选择一个算子或函数,HDevelop 显示它的接口,例如:名称、值、和每个参数的类型。 在该参数的第一列用图标来表示参数的类型。注意,每种类型只有一个图标,当一种类型 的参数有多个时,也只有一种图标。鼠标光标停在图标上会有参数的提示性描述:

在算子窗口的第二列,显示参数的名称。 第三列为设置参数。如果想更改变量名或默认值,可以手动设置或通过点击下拉框进行选 择。第四列为参数的语意类型和数据类型。 当鼠标光标悬停在二至四列时,会有相应参数的提示性描述。 2.5.3 控制按钮 在按钮区,有五个按钮,包括以下功能: 1. 确定 单击“确定” ,参数立刻生效,并马上执行算子或函数,同时更新程序,并清除算子窗口参 数的内容。 2. 输入/替换 如果是新算子,点击输入,插入新代码。如果是编辑已有算子或函数的参数,点击替换, 更新参数。点击输入/替换,不执行算子或函数,点击后,清除算子窗口参数的内容,同时 更新程序。 3. 应用 单击“应用” ,参数立刻生效,并马上执行算子或函数,但不更改程序,同时算子窗口参数 的内容保持在打开状态,这使用户能够快速确定最佳参数。 4. 取消 单击“取消” ,清除算子窗口的内容,程序和变量没有任何变化。 5. 帮助 点击帮助按钮来打开算子或函数的帮助文档。 2.6 变量窗口 在 HALCON 中有两种变量,对应两种参数类型:图形对象(图像、区域和 XLD)和控制 数据(数字、字符串) ,相应的变量称为图形变量和控制变量,这些变量可能有值,也可能 还未定义。假如未定义的变量被创建,例如,加载一个程序或者插入一个带有新变量的算 子(插入后在程序中并没有立即执行) ,那么,可能只能通过写来访问这些未定义的变量, 如果尝试读取这些变量,就会发生运行时错误。如果一个变量被赋值,那么该变量就更精 确了。例如,一个控制变量包含一个整数,那他的数据类型是整数。这个变量在赋予新值 后,数据类型可能会改变成实型或者整型元组,但它仍然是一个控制变量。同样,图形变

量也一样。可以给一个图形变量赋予新值,但是不能改变它的类型,不能把它变成一个控 制变量。例如下图所示的变量窗口中的图形变量和控制变量:

在算子窗口区域选取算子或函数后要创建新变量,每一个没有单引号的字符串都被当做变 量名。如果这个变量名以前不存在,那么通过按确定键或 enter 键来创建变量。变量的类型 在该变量第一次使用的时候获取: 变量对应于图形对象参数, 那么创建一个图形变量; 变量 对应于控制参数,那么创建一个控制变量。每次执行一个算子或函数调用,输出结果存储 在它输出参数的变量中。 变量窗口类似于一个以调试为目的的观察窗口,在这个窗口中可以跟踪变量值。对应于这 两种变量类型,变量窗口有两个区域:图形变量区域和控制变量区域。所有计算过的变量 会显示图形值或控制值(除非关闭了自动更新) 。 在大型程序变量窗口中,可能变得非常混乱,这使得观察所选变量变得很困难。因此,您 可以定制选择要显示的变量。在变量窗口底部,有以下标签页可用:

(1)所有 显示当前函数使用的所有变量。全局变量有一个为全局图标标记。 (2)自动 显示当前算子的变量和前一个算子的变量。单步执行时,这是非常有用的,因为仅显示当 前算子和前一个算子的变量。 (3)用户 显示用户选择的变量。选择把关注的变量添加到用户标签栏,便于查看。在其他标签栏, 选定变量,把变量通过右键菜单添加到用户标签栏;在用户标签栏,通过右键菜单删除变 量。 (4)全局 显示当前程序所有的全局变量。这包括外部函数的全局变量,即使他们在当前程序中没有 使用。 (3)用户 显示用户选择的变量。选择把关注的变量添加到用户标签栏,便于查看。在其他标签栏, 选定变量,把变量通过右键菜单添加到用户标签栏;在用户标签栏,通过右键菜单删除变

量。 (4)全局 显示当前程序所有的全局变量。这包括外部函数的全局变量,即使他们在当前程序中没有 使用。 2.6.1 图形变量 图像变量用图标描述,可能包含一个图像,一个区域或一个 XLD,取决于当时的值。 1. 显 示图像变量 鼠标左键双击一个图标,把图形数据显示在活动的图形窗口。 2. 显示图像变量的信息 将鼠标指针放置变量窗口的图标上,可以得到一个实例化的变量的信息。信息的内容取决 于相应的变量。 图像:显示图像类型和尺寸和通道数量。如果图形变量包含多个图像,那 么显示第一个图像的属性。 region: 显示区域的面积和中心。 如果图形变量包含多个区域, 那么显示第一个区域的属性。 XLD:显示轮廓点的数量和长度。如果图形变量包含多个 XLD,那么显示第一个 XLD 的属性。 3.右键菜单 用鼠标右键点击一个图标,打开右键菜单:

显示选择的图形变量。区域和 XLD 显示在以前的图形窗口的内容之上。 (2)显示通道 显示选择的图像变量的其中一个通道的图形。这个菜单列表最多有 15 个通道。如果图像变 量包含超过 15 个通道,您可以通过点击“选择?”访问其余通道。这项只有选择的图像变 量包含多通道图像的时候才有效。 (3)清除/显示 先清除激活图形窗口的图形,再显示选中的图像变量。 (4)清除变量 清除选择的图形变量。变量的内容更改为未定义。 (5)增加到用户标签 选择变量添加到用户标签。 (6)搜索变量 打开“查找/替换?”对话框,用来搜索变量。 (7)在程序中插入 dev_display()函数 把算子 dev_display 插入到程序窗口鼠标所在的位置。插入的算子的参数是所选的图像变量 的名称。

(8)声明(只适用于全局变量) 列出使用了所选全局变量的函数的名称和行号。点击一项,在程序窗口中跳转到相应的位 置。 (9)按名称分类 所有的变量按字母顺序排序。 (10)按事件分类 按照在程序中定义的先后顺序排序。 (11)更新变量 设置在程序执行期间是否更新变量。 (12)清除无用变量 删除所有未使用的变量。 (13)添加变量(仅用户标签栏) 点击一个变量名把对应的变量添加到用户标签栏。 (14)从用户标签栏删除(仅用户标签栏) 从标签栏中删除所选变量。 4. 图形变量可视化 通常情况下,区域、图像和 XLD 用变量图标表征。除此之外还有三种例外,用特殊的图标 表征: (1)未定义的变量显示为问号标志(?) 。可以写但不能读他们,因为他们没有值。 (2)如果一个变量被实例化,但不包含一个图形对象(空元组) ,用方括号([ ])表征。 例如,select_shape 算子使用了一个“错误”的阈值或使用算子 gen_empty_obj 所导致。 (3)最后一个特例是一个空的区域。这是一个区域,不包含任何像素(点) ,即面积(点数)为 0。不能把它与空元组混淆,因为该区域没有定义。空区域用空集图标 ([ ])表征。 2.6.2 控制变量 对控制变量赋值,如果数值多于一个,即元组型变量,那么这些数值通过“,”分割,用方 括号括起来,如:A:=[1,2,3]。 未定义的变量,他们的名称显示在控制变量区,值显示为?:

一个空元组用[]表示:A:=[] 1. 检测变量 参见:dev_inspect_ctrl 双击一个控制变量,打开一个变量监视窗口,以表格格式显示所有的值。要分析数据,在 窗口下面的表格(即统计区)弹出右键菜单,选择“显示所有” (也可以选择部分项) ,那 么就显示了所有统计数据:

在变量窗口通过按住< Ctrl>键来选择多个控制变量,然后弹出右键菜单,点击检测,把多 个变量加入到同一个变量监视窗口:

矩阵控制变量检测,显示如下图所示:

2. 检测图像采集设备 在控制变量区域双击图像采集设备句柄, 打开一个检测对话框。在这个对话框可以找到采 集设备的图像大小,名称,设备,端口号等信息:

勾选“在线” ,在激活图形窗口显示实时图像。支持多个采集设备同时实时采集。在采集过 程中发生了错误,会把错误信息显示在对话框的状态栏。 3.右键菜单

(1)检测 在一个监测窗口检测所选控制变量的值。 (2)拷贝 将所选变量的值复制到系统剪贴板,便于在其他文档中使用。也可以使用< ctrl +c >快捷键 进行复制。如果选择多个变量,不同的变量在不同的行显示。 (3)清除变量 清除选择的控制变量。变量的内容变为未定义状态。

(4)添加到用户标签 所选变量添加到用户标签。 (5)搜索变量 打开查找/替换对话框,搜索变量。 (6)声明(只适用于全局变量) 列出使用了所选全局变量的函数的名称和行号。点击一项,在程序窗口中跳转到相应的位 置。 (7)按名称分类 所有的变量按字母顺序排序。 (8)按事件分类 按照在程序中定义的先后顺序排序。 (9)更新所有变量 设置在程序执行期间是否更新变量。 (10)清除无用变量 删除所有未使用的变量。 (11)添加变量(仅用户标签栏) 点击一个变量名把对应的变量添加到用户标签栏。 (12)从用户标签栏删除(仅用户标签栏 从用户标签栏中删除所选变量。 2.7 图形窗口 1. 图形窗口显示图形数据,具有如下属性: (1)用户可以打开多个图形窗口。 (2)用户通过图形窗口右上角的激活图标—小灯泡来选择激活图形窗口。 (3)用户通过图形窗口左上角的清除图标—来清除图形窗口内容。 (4)点击窗口右上角的即可关闭图形窗口。 2. 下图是一个披萨的彩色图像:

把香肠分离出来,选中某个香肠区域后,该区域所对应的变量名和索引显示在图形窗口的 标题栏中:

放大图形,把鼠标停留在图像上的某点,按下 ctrl 键,在图像上显示出该点的坐标、图像

变量名和灰度值:

3. HDevelop 中每一个图形窗口都有自己的可视化参数。因此,修改这些参数时仅能改变当 前激活的窗口,也就是说所有其它打开的图形窗口的参数都保持不变。另外,更改后的参 数设置将会作为以后打开的所有图形窗口的默认参数设置。 图形窗口坐标系的原点在左上角,坐标为(0,0) 。X 轴正向为从左到右,Y 轴正向为从上 到下。当鼠标的光标放在图形窗口内时,光标处的坐标和灰度值(或者是 RGB 值)都会显 示在状态栏中。有时需要在鼠标光标处显示出这些信息,为此我们可以按下 Ctrl 键(注意: 当选中放大和缩小工具时,按住 Ctrl 键只会反转放大和缩小功能) 。上图显示了利用鼠标滚 轮进行放大后图像光标处的坐标和 RGB 值。 通常,图形窗口的坐标系对应于最近显示的一张图像,它通过自动缩放以保证能看见整张 图像。通过使用图形窗口的工具栏或者菜单“可视化 => 参数设置 => 缩放”或者运算符 dev_set_part,我们可以改变坐标系统。每次当显示另外一张不同大小的图片时,坐标系统 总是会自动的调节。 每个窗口都有最近一次打开的图像的显示或者修改的记录,其中包括对象和显示参数。这 个记录用于窗口内容的重绘,最多只可以重绘 30 次,其中一次重绘包含一个显示变量的所 有对象。 别的输入,比如说文本或者一般的图形(disp_line 或者 disp_circle)或者用 disp_image、 disp_region 这些算子显示的图形数据,就不属于记录的内容,不能重绘。只有对象(图像、 区域和 XLD)才属于记录的一部分。 可以通过拖动窗口的边框改变图形窗口的大小,之后图像窗口显示的内容也会重新显示。 显示的内容和改变窗口大小之前的内容是一样的。 4. 3D 图模式 (1)点击 把图像变为 3d 图模式。它能有效的显示高度信息,把二维图像的灰度信息作为 3D 点图的高度信息,灰度值越大,对应点的高度越大。下图(a)是一个披萨饼的灰度图, (b)是对应的 3d 图。3d 模式使用 OpenGL,可以使用硬件来加速。

(2)使用鼠标来对 3d 点图进行旋转、平移、拖拽等操作 (首先需要选中图形窗口工具栏 里) 1)在图形窗口按住鼠标左键,拖动图像实现旋转。 2) 按住 Shift 键, 按住鼠标左键上下拖动, 可以缩放图像。 或者滚动鼠标滚轮缩放图像。 3) 按住 Ctrl 键,按住鼠标移动,可平移图像。 (3)3d 图工具栏

也可以通过菜单“可视化=>设置参数?=>显示=>3d_plot”设置:

3d 图有四种不同的渲染方式( texture 纹理, shaded 阴影, hidden_lines 隐藏的线和 contour_lines 轮廓线) ,可以在工具栏的下拉列表中选择,如图 。关于渲染方式的详细信 息可 以参见 set_paint。图像质量可以在图形窗口的工具栏或者图形窗口的可视化参数(右击图 形窗口,选择“设置参数...=>显示” )中选择。 “模式”是用来设置渲染模式的。 2 图像质量

3d 图质量:有 best,good,medium,low 四种选项。 步长:可以设置显示细节的程度。值越小,图像显示的细节就越多。但是对于 contour_lines 模式,情况是相反的。 3)显示坐标轴 决定在 3d 点图中是否显示 3d 坐标轴。 4)显示网格 决定在 3d 点图中是否显示 3d 坐标系基准平面网格 5. 图形窗口的键盘快捷键 <Left, Right, Up, Down> 移动鼠标光标,每次 1 pixel <Alt>+<Left, Right, Up, Down> 移动鼠标光标,每次 10 pixels <Ctrl>+<Left, Right, Up, Down> 平移图像,每次 1 pixel <Ctrl>+<Alt>+<Left, Right, Up, Down> 平移图像,每次 10 pixels 6.图形窗口工具栏 清除窗口内容 切换到选择模式。在这个模式中,可以选择区域或者 XLD,选中的目标边界是虚线。 按住 鼠标左键移动图像。使用鼠标滚轮缩放图像。 放大镜。点击放大镜,在鼠标光标处显示放 大区域。如下:

放大。点击旁边的小箭头图标切换到缩小。 缩小。点击旁边的小箭头图标切换到放大。 设置图像大小。箭头下拉选择改百分比。

设置窗口大小。箭头下拉选择,更改百分比。 创建新的 ROI 把图像变为 3d 点图模式 激活图形窗口 不激活图形窗口。 如果要设置激活窗口的各个参数, 在菜单栏中选择 “可视化” 。 在这里可以设置适当的参数, 需要设置哪个就单击即可。设置的参数只是针对当前激活的窗口。新的参数只会影响窗口 记录的最近一个对象以及它的参数。 7. 图形窗口右键菜单 在“编辑”菜单栏选择“参数选择” ,在“运行时设置” ,通过是否勾选“使图像窗口中的 邮件菜单有效”来开启/关闭图形窗口右键菜单。这个右键菜单等效于“菜单栏”的“可视 化”选型。

2.7.1 交互创建和操作 ROI 和 XLD 在图形窗口允许创建及操作多个 ROI(即区域) 。这些 ROI 是一些几何元素(画的直线、 圆、椭圆、圆弧、矩形、任意多边形等)构成的集合。最终,这些集合插入到当前的程序, 生成程序行,产生 ROI 或 XLD,还可以在某一个已知维度上进行简单的交互测量,然后将 像素转换到世界坐标中。 1. 生成交互的 ROI 单击图形窗口工具栏图标 ,弹出创建一个新 ROI 的对话框:

默认情况下,图形类型设置为 ROI(参见工具条) ,而这正是这个例子中我们需要的。首先 产生一个矩形: 点击,在图形窗口按下鼠标左键,绘制一个初始的矩形, 可以通过拖动矩形的边或角修正矩形,然后点击鼠标右键确认绘制完成,就会在工具箱中 创建矩形。 如下图所示:

重复上一步创建另一个矩形:

单击 在当前程序中生成程序代码。 gen_rectangle1 (ROI_0, 163.832, 274.43, 327.046, 357.359) gen_rectangle1 (TMP_Region, 327.046, 193.303, 400.828, 269.021) union2 (ROI_0, TMP_Region, ROI_0) 在这个例子中,图形变量 ROI _0 由由两个矩形区域确定。 2. 编辑 ROI 请注意 ROI 变化不记录在撤消缓冲区,不能恢复。可以用“文件=>把 ROI 保存到文件” 的功能,把 ROI 输出保存到本地电脑,后续要用的时候,在使用“文件 =>从文件中加载 ROI”的功能来读取 ROI。 如果需要修改 ROI,通过修改 ROI 的各个几何元素来实现。 在下图中,选择上边的矩形,可通过拖动,拉伸等动作进行修改,修改后点击右键确认, ROI 对话框中相应的值会随之更新。也可以编辑对话框中的参数值来进行修改(黑色的可 以直接修改,灰色的无法直接修改) 。参数周长和面积是根据矩形的其他参数计算得到的, 他们不能直接修改,显示为灰色。

如果双击上面的矩形,图形将被选中,可以用鼠标拖动。 在一般情况下,如果几何元素有重叠区域,第一次点击将选择顶端的元素(某一个图形) 。 以后每点击将相应的选择下面的元素。当到达最底层,下一次点击将选择整个 ROI。在一 个多图形堆叠时,通过点击对话框中相应的几何元素会更容易一些。 3.从图中删除元素

选定元素,按下 <Del>,或单击进行删除。所有的数据可以通过点击删除。 4. 可以通过点对话框中相应的图标,给 ROI 添加额外的几何元素:

5. 添加其他的 ROI ROI 对话框支持创建多 ROI。单击在工具盒中添加一个新的(空的)ROI。随后绘制新的 元素,将他们添加到新 ROI 中。生成代码时多个 ROI 转换成一个对象元组。 6. 模式选择 ROI 对话框支持三种操作模式。该模式可以选择从工具栏的下拉按钮或菜单中的 ROI 类型 切换,如下图 2 个红色矩形区域所示:

类型: (1) (区域,ROI) 如果想生成一个基于像素的感兴趣区域,选择此模式。ROI 由几何元素构成。这些几何元 素由(并集、交集、差集等)设置操作集合在一起。 每个几何元素的掩模式可以独立切换,通过点击相应的工具盒图标: 默认的掩蔽模式()选择元素的内部,例如,一个圆的内部区域。 补集掩蔽模式()选择元素的外部,例如,一个圆外部。 (2) (XLD) 如果想生成一个基于矢量的封闭轮廓 XLD 或线(XLD) ,选择此模式。XLD 由几何元素构 成。这些几何元素由(并集、交集、差集等)设置操作集合在一起。 (3) (Path) 如果想生成一个基于矢量的路径 XLD 选择此模式。路径由几何元素构成。路径的各个元素 通过直线连接,这种连接是自动完成的,两个端点分别与相邻的最近的端点连接 根据所选模式,有以下几种不同的几何元素:

6.设置操作 一个 ROI 的元素通过设置操作实现集合。如果是 ROI 模式,使用设置操作确定复合区的最 终区域。对于封闭轮廓 XLD 设置,运用设置操作确定最终轮廓。对于 path 模式,设置操 作没有意义,因此在该模式下不可用。 下一个新的元素的设置操作,可以选择从工具栏的下拉按钮或菜单操作。现有元素的设置 操作可通过点击对话框中相应的元素的数据块实现。 可用的设置操作如下所示: union,A 和 B 的和集 intersection,A 和 B 的交集 difference,A 和 B 的差集 A‐B xor,A 与 B 交集的补集 设置操作如下图所示:

6.交互式测量 通常,在工具盒的所有尺寸都是以像素为单位。利用一个简单的标定将像素值转换为真实 尺寸,即获得某个维度的尺寸。 以下图为例进行 2 维标定(线的长度是已知的,因此它可以被用于标定) :

单击打开 2d 标定面板.下拉组合框选择所需的单位:mm。选择 Set 2D 标定,开始 2D 标定 模式。 点击,绘制线段,如上图所示。单击元素数据块的长度,并指定已知尺寸,例如, 10 为 10mm。 标定后结果: 选择修改区域模式, 离开 2D 标定模式。现在,对数据块的参数中的任何修改都会修改图 形,但是不会修改标定参数。 标定后,把线段起点放在 20,终点放在 40,如下图所示: 在 ROI 对话框上获取测量值:

2.8 帮助窗口 通过帮助窗口可以访问 HALCON 的在线文档。 该窗口分为两个区域: 左侧窗口以标签页的 形式提供了导航面板;右侧的主窗口像网页浏览器一样,显示实际的超文本内容。可以拖 动分割线调整两个区域的大小。 部分文档以 PDF 格式提供。 帮助窗口本身并不显示这些 PDF 文件, 当 PDF 链接被点击时, 启动默认的 PDF 阅读器加载 PDF 文件。如果一个 PDF 文件的链接出现在导航栏(或者作 为一个全文检索的结果或者是索引关键词的选择) ,它将被标记上一个 PDF 的图标。单击 将会选择一项并在目录区显示该文件的链接。双击(或按下回车键)将在外部的阅读器中 打开相应的文件。 这样, 你可以在导航面板中快速的浏览搜索或索引结果, 而不必运行 PDF 阅读器。帮助窗口如下图所示:

1. 帮助窗口标签页 (1)目录 此标签页以层状树的形式显示在线文档各章节。点击层状树的结点显示相关的文档。 (2)算子 此标签页按字母表排序,列出了所有的算子。点击算子的名称将显示参考手册的相应页面。 在过滤文本框中输入任何名称将过滤并显示匹配的算子。目录标签页对话框如下图所示:

(3)搜索 在文本框里输入一个关键字,单击“搜索”开始全文搜索。文本框下面的检查框指出了搜 索的范围。例如,为了保证只显示 HTML 的匹配项时,可取消勾选 PDF 选项,搜索结果 显示在搜索文本框的下方。范围(以百分比的形式,比如 45,表示 45%)指示出每个搜索 到的文档符合搜索关键字的程度。 该搜索关键字可以包含一个或多个单词,HDevelop 将找到包含任何指定单词的所有文档。 如果要搜索一个短语,需要用双引号(注意:是英文的双引号)把短语包含起来。例如: "radiometric calibration" 可在必须要搜索的单词前加上加号( +) 。例如,搜索所有包含 “filter”和“gauss”的文 档,可输入:+filter +gauss 可以从搜索结果中排除指定的单词,为了查找所有的关于滤波(filters)但是排除关于高斯 滤波(Gaussian filters)的文档,请输入: filter –gauss 搜索标签页对话框如下图所示:

(4)Index 像书的目录一样, 该标签页允许通过索引项访问 HALCON 算子和文档相关的章节。 索引项 的列表可以通过在文本框中输入任何单词来过滤。如果你输入多个单词,只有匹配全部单 词的索引项才会显示。 当从列表中选择索引项时,相关的算子名称和相应文档的链接显示在索引项的下面。可以 点击算子的名称阅读它的在线帮助文档。如果你点击一个文档链接,将会打开相应的 PDF 文件。请注意,链接文本也包含页码以便用户可以非常快捷的找到目标的信息。索引项标 签页对话框如下图所示:

(5)书签 该标签页列出了所有的用户定义的书签。你可以通过点击“添加”按钮添加当前显示的文 档到该列表。从列表中移除一个书签,可选择该书签并点击“删除”按钮。书签标签页对 话框如下图所示:

2.9 缩放窗口

功能:打开一个缩放窗口,用来查看图像的细节和检测像素。 参看:可视化=>缩放窗口 缩放窗口能够检测图像的细节。你可以打开任意数量、不同放大倍数的缩放窗口(见菜单 “可视化=>新窗口缩放” ) 。 该窗口还可以显示鼠标光标所在位置的每个图像通道的灰度值, 此外还会显示像素类型、通道数以及光标当前位置。放缩比例可以从下拉框中进行选择。 它的取值与图像的原始尺寸有关。

缩放窗口的使用 在缩放窗口中勾选“鼠标跟踪” ,移动鼠标到需放大的图像区域。鼠标在需要放大的区域点 击一下,这样即使鼠标移出图形窗口时,缩放窗口显示的还是放大的区域的图像。或者取 消鼠标跟踪,然后单击(或拖动)需要放大的区域,这样即使鼠标移出图形窗口时,缩放 窗口显示的还是放大的区域的图像。缩放窗口中央的红色方块表示鼠标光标的位置。它对 应的坐标显示在窗口底部。 对于更精确的操作, 可以单击缩放窗口, 使用键盘来精确操作。 在窗口的左下角,以柱状图的方式显示中心像素的灰度值,范围从 0 ~255。通常情况下, 单通道以黑条显示。多通道相应地显示每个通道的颜色。因此, RGB 彩色图像是三色条。 上图显示了三个通道,灰度值显示为数字。 旁边下拉框中可以选择放大比例, 调整窗口尺寸,使在边缘部分的像素完全可见。 2.10 灰度直方图窗口 功能:显示激活图形窗口的灰度直方图。 参见:菜单“可视化=>灰度直方图 灰度直方图窗口是检查灰度直方图的一个复杂工具,也可用于交互式选择阈值和动态设置 显示的灰度值范围。灰度直方图窗口如下图所示:

打开工具时,灰度直方图窗口显示的是激活图形窗口中显示图像的灰度直方图。当灰度直 方图工具已经打开,有以下几种方法可以发送新的图像数据给灰度直方图: (1)激活另一个图形窗口,或者在激活窗口显示另一幅图片,工具会计算新图像的灰度直 方图并显示。 (2)在图形窗口中,当显示的图像数据被区域数据覆盖时(此时图形窗口不需要激活) , 可以选择任何分割的区域,灰度直方图工具就会计算并显示该区域的直方图,如果选择的 图像部分都不是分割区域,则显示的是整个图像的直方图。 (3)同样的方法应用于具有灰度值信息的区域,例如,由 reduce_domain 或 add_channels 创建的图像对象。灰度直方图工具显示选择的图像对象的直方图。 1. 冻结灰度直方图 有时当有新的图像数据时,不希望更新直方图,例如,如果为梯度图像选择阈值,希望将 原始图像在阈值分割时可视,在这种情况下,可以通过取消“更新” ,冻结直方图。当前显 示的直方图会保持不变,直到到重新勾选“更新” , 一旦勾选“更新”后直方图工具就重 新计算当前激活窗口图像的直方图。 2. 灰度直方图显示 该工具的主要部分是图像直方图中显示为蓝色的区域,该区域包含静态部分与可被交互操 作部分。第一个静态部分是水平坐标轴,它显示图像中的灰度值。对于字节图像,这个范 围是 0?255;对于所有其他类型的图像,例如,real 类型的图像,横轴是从图像的最小灰 度值到最大灰度值,相应的该轴的标记会随之变化。在区域的左边是纵轴,纵轴表示灰度 值的频率。最后的静态部分是灰色箭头:两个向上的箭头表示图像的最大和最小灰度值, 两个向右的箭头表示直方图的最大和最小频率,这些数据也显示在统计区内。直方图的峰 值(灰度值发生频率的最大值)也显示在统计区内。对于 INT4,int8,或 real 类型的图像,

峰值以取值范围的形式在统计区显示。直方图的“峰值”实际上代表了所有输入值的范围。 直方图的动态部分是可以操作的两个有颜色的线。垂直的绿色和红色线分别表示选中的灰 度直方图的最小和最大灰度值,垂线所代表的灰度值以相同颜色显示在垂线的旁边。红色 箭头表示当前鼠标光标的位置。 (1)直方图的选项 这些控件定义直方图的可见区域和它的显示方式。选项如下图所示:

1) 量子化: 量化直方图显示。 量化值的大小可以通过滑动条或微调控件进行调节。 单击 “自 动选择”让 HDevelop 自动选择一个合适的值。 2)平滑:显示平滑后的直方图。平滑因子可以通过滑动条或微调控件进行调节。复选框 Enabled 指定是否开启平滑。 3)垂直/水平: “垂直”调节显示区域的下边框和上边框; “水平”调节显示区域的左边框和 右边框。 每当灰度直方图窗口中放置新图像数据时,上述值是否被采纳取决于所选择的适 应模式(选择输入对象影响灰度直方图显示区域的方式) ,该模式可以在水平和垂直的范围 内独立设置: ⅰ)自适应 在这种模式下,显示一个新图像时,显示区自适应的显示在灰度值下边界(最小值)和上 边界(最大值)之间的灰度值。 ⅱ)渐增 在这种模式下,显示区自适应显示灰度值的上边界。上边界可以改变,但是它只能增加, 而不能减少。 ⅲ)固定的 在这种模式下,边界不会自适应改变(但可以手动更改) 。 (2)灰度直方图工具栏 线性显示(默认)直方图。 对数显示直方图。 最开始直方图显示整个垂直范围, 即, 达到峰值。 显示部分可以用下面的按钮进行操作: 根 据所选区域,放大显示直方图。单击此按钮,在直方图区域选择一个区域,放大显示所选 直方图。 显示两条线之间的部分(灰度直方图) 。先把绿色和红色垂直线放置在期望的灰度值区间, 然后点击此按钮。 重置,显示完整的直方图。 重置高度,重置直方图的纵向显示。 重置宽度,重置直方图的横向显示。 强制最小直方图宽度。 调整窗口大小时,不调整直方图的宽度。 2.10.1 交互式可视化操作 选择灰度值范围主要有两个目的:二值化(阈值分割)和缩放灰度值。下面的示例,应用 halcon 的图像:rings/mixed_03.png。如下图所示: 原图:

threshold(阈值分割):

threshold+connection:

缩放:

把在绿线和红线之间的灰度值作为目标输出,输出目标位置在原始图形窗口或活动图形窗 口。 可视化类型是在直方图下方的表中设定的,单击“ +”按钮在表中添加一个新操作, 单击“‐”按钮从表中删除一个操作。列操作用来设定(阈值或缩放)灰度值范围。具体某一 个可视化操作,单击“操作”对应的图标。 当一个多通道图像,例如, 一个 RGB 彩色图像,送入工具后,默认显示第一通道的直方图。 你可以通过 channel 列选择通道,从而计算其直方图。对于 RGB 图像,通道也可以设置为 特殊模式 RGB 显示了所有三个通道的组合直方图。 列的最小值和最大值分别对应绿线和红线的位置。每个操作可以指定其灰度值范围。操作 部分如下图所示:

2.10.1.1 阈值操作 直方图对应的图像通过选定的最小和最大灰度值进行阈值分割。 通过输出部分的三个组合框:颜色,画以及线宽度,可以指定分割结果的显示属性(参见: 颜色,画以及线宽度) 。输出部分:

如果你想选择单一图像的阈值参数,在激活图形窗口中显示图像并打开灰度直方图工具。 为了使分割结果的视觉效果更好,最好把颜色设置成彩色。现在,把“操作”设置为“阈 值”并拖动两垂线,直到达到理想的分割效果,阈值操作的参数可以从两个垂直线读取。 如果你想选择一个图像的阈值,而该阈值为另一个图像的阈值参数,但要显示对原始图像 的分割,例如,如果你想选择一个梯度图像的阈值,存在两种办法: (1)第一种办法:首先,可以显示源图像,打开直方图工具,取消更新,显示原始图像, 然后选择合适的阈值。这样,只需要有一个窗口显示。 (2)第二种办法:可以在一个窗口中显示源图像,激活另一个窗口或打开一个新窗口,里 面显示原始图像(与源图像不是一个图像) ,再次激活第一个窗口,打开直方图工具,再次 激活第二个窗口, 作为输出显示窗口 , 并选择阈值。 虽然在这种情况下没有必要取消更新, 但是取消更新是有好处的,因为如果你意外点击一个图形窗口时,可以防止直方图被更新。 多阈值操作 可以进行多阈值联合操作。如果同时有多个可视化操作,显示结果取决于操作表下面的组 合框: 如果选择无,不同的阈值操作的结果单独显示; 如果选择合并,结果就会合并为一个区域; 如果选择交集,只显示所有结果的共同像素部分。 连通区域 单击, 按照指定的颜色,画,和线宽度格式连通区域。这显示模式类似于普通的阈值操作, 此外,它执行“连接”操作。如果颜色设置为 3 色,6 色或 12 色,不同区域会区分开。单 击“插入代码”按钮来生成 HDevelop 代码,代码插入到 IC 处。 这些代码在程序中执行当 前可视化阈值操作。如果灰度直方图窗口保持打开状态,阈值(和连接)操作得到的区域 可作为特征直方图窗口或特征检测窗口的输入,在接下来的章节中将具体讲解这些窗口。 2.10.1.2 缩放操作 缩放操作是把位于绿线和红线之间的灰度值扩充到全范围(通常是 0...255 ) 。 参见: scale_image。 对图像的灰度值进行缩放,缩放后图像的灰度值 0 对应于选定的最小灰度值,灰度值的 255 对应所选定的最大灰度值。输出目标位置确定结果显示在哪个图形窗口。

可以定义多个缩放操作,但在图形窗口一次只显示一个。单击“插入代码”按钮来生成 HDevelop 代码,代码插入到 IC 处,在程序中执行当前可视化缩放操作。 2.11 特征直方图窗口 功能:特征直方图的交互检测。 参见:菜单可视化=>特征直方图 该窗口为特征直方图的检测提供了一个先进的工具。相对于上一节中描述的灰度直方图, 这个工具不支持单个像素的检查,但支持区域或 XLD;对于这些图形对象,它显示一个选 定特征值的分布,例如在一个 XLD 的面积或者某个区域像素的平均灰度值。特征直方图也 可以交互式的为算子 select_shape 和 select_shape_xld 选择合适的阈值。类似于灰度直方图 工具,交互式选择可以转换成 Hdevelop 程序代码。 打开以后,此工具在活动窗口显示区域或 XLD 的面积特征直方图(面积特征是默认特征) 。 可以在“特征”组合框选择各种特征。更多的关于区域特征的信息参见“特征检测窗口” 部分。 以下图为例:

首先,某一尺寸(面积)的所有对象(区域)都被选中。然后,加入更多的限制条件,精 确调节选择对象。在这个例子中,最终的选择对象只包括圆形的物体,即,具有比较高的 圆度特征的区域。在这个例子,如果你点击按钮“插入代码”将生成下面的代码: select_shape (ConnectedRegions, SelectedRegions, ['area','roundness'], 'and', [2900,0.71649], [3900,0.79279]) 该工具大部分都类似于灰度直方图,在上一节进行了详细说明。强烈建议事先阅读灰度直 方图的说明;接下来,我们主要介绍特征直方图的关键部分。很重要的一点,区域或 XLD

的来源是非常重要的:特征直方图是根据最近显示在图形窗口的区域或 XLD 计算得到的。 因此,如果显示一个图像,该图像没有区域或 XLD,则直方图是“空” 。一旦在图像上显示 区域或 XLD,就会立即计算得到直方图。如果没有图像,只是显示区域或 XLD,仍然可以 计算特征直方图, 但只有形状特征。 请记住, 只有最新显示的区域或 XLD 是直方图的来源, 不是所有当前显示在图形窗口的对象!直方图的水平轴对应特征值,纵轴对应频率值,比 如对应具有一定的特征值的区域或 XLD 的个数。 与灰度直方图相比,你会注意到一个典型的区别:在大多数情况下,区域或 XLD 的总数比 像素的总体数量少得多,特征直方图通常由一些独立的线构成,这些线大多数高度为 1。 可以操作量子化滑块来修改计算直方图。选定的值用于离散化水平轴,在离散区间特征值 的频率相叠加。对于图形来说,通过量子化滑块的值,把水平轴分成宽度相同的块。 操作 部分如下图所示:

与灰度直方图操作相同,每个选定的特征必须开启使能功能后才能在图形窗口中显示。 2.12 特征检测窗口 功能:特定区域的形状和灰度值检测 也可通过以下打开窗口:菜单“可视化=>特征检测” 该窗口提供了一种针对特定区域和 XLD(轮廓数据)便利的形状和灰度值检测工具。例如, 该工具用来确定一些算子的阈值, 这些算子通过特征来选择区域, 例如算子, select_shape 和 select_gray。 计算上述特征的应用窗口,所使用计算数据的方法非常类似灰度直方图检测 窗口(可以参见 “灰度直方图窗口”章节) 。在图形窗口显示图像或区域。显示图像,马 上计算出整幅图像的灰度值特性来。如果你单击一个不属于某幅图像的区域,那么仅仅只 会显示该区域的外形特征。如果你单击一个拥有灰度值信息,且属于某幅图像或者属于另 一个区域的区域, (例如通过算子 reduce_domain 或 add_channels),那么该区域的形状和 灰度值特性都会被显示出来。最后,如果你已经用一个区域覆盖一幅图像,但是单击该图 像在上述区域外面的部分,那么只有整个图像的灰度值信息将被计算出来。 使用绘图窗口的“选择”工具来选择一个区域或者一个 XLD(轮廓数据) 。被选中的区域或 者 XLD(轮廓数据)将在该图形图像窗口呈现高亮状态。相应的变量名称和索引号将在特 征检测窗口的标签栏显示。 多通道图片的灰度值特征信息是根据所有不同的通道信息各自分别计算的。 特征检测窗口左侧的树形结构归纳了几种特征的分类情况。在最上一层,下面子层的特征 组区分如下: (1)region 特征:该组信息包含描述选择区域的面积,中心,方向等特征信息; (2)gray value 特征:该组特征值是通过计算选中区域的图片灰度值得出的,例如。最小 灰度值,最大灰度值,平均灰度值,各向异性,熵值等。 (3)XLD 特征:该组包含描述选择 XLD 的特征信息(例如维度,形状特性等) 也可以通过勾选下面的复选框来检测相关的特征信息。被选中的特征信息将在窗口右侧显 示,详细的显示选中的区域或者 XLD(轮廓数据)的每个计算特征值。当前值也被视为一 个范围值的基准值,并通过它来设定期望的范围值。在窗口右侧点击鼠标右键,在菜单中 选择“显示最小化/最大化” 。 下图是特征检测使用的示意说明,区域特征的范围被设定为 [2000,7000]。

移动鼠标箭头到一个特征值名称上将显示相应的工具提示‐‐用来计算这个特征值的 HALCON 算子的名称和简略描述。使用右键菜单,可以把相应算子插入到算子窗口。 2.13 轮廓线窗口 功能:显示激活窗口的轮廓线. 参见:可视化=>轮廓线 选择此项可以打开一个非常有用的工具,它可以用来检测线性或圆形 ROI 的灰度值分布, 如下图所示:

利用轮廓线有利于在测量助手中优化边缘检测,或者检测相机焦点。 “轮廓线显示”部分具 体介绍了 ROI 的轮廓线显示。注意,轮廓线窗口是一个可视化的工具,但是不能用于创建 任何输出,如修改图像或者生成代码。 当不使用测量助手打开轮廓线窗口时,什么都不会显示,直到在轮廓线窗口使用相应的按 钮在图形窗口绘制了 ROI 区域。 有多种选择可使轮廓线连接到不同的窗口: (1)激活另一个图形窗口或者在当前活动窗口中显示另一幅图像。这样做,将会计算图像 中 ROI 的轮廓线并将其可视化,并且,该工具将发送的图像存储在图形显示窗口(原始窗 口) 。 (2)如果需要检测两个窗口的两个轮廓线,需要为第二个窗口打开一个新的轮廓线 窗口。 (3)通过激活轮廓线窗口“数据源”下方的“测量助手”复选框,可以选择测量助手作为 数据源,如果同时有多个助手,注意从下拉菜单中选择正确的助手作为数据源。 (4)轮廓线也可以从测量助手窗口打开,通过在“边缘”标签页点击“显示轮廓线”按钮。 2.13.1 轮廓线窗口的 ROI 菜单 如果“测量助手”没有被选择作为 ROI 的来源,那么可以使用轮廓线显示区域上方的 ROI 菜单按钮来创建和编辑一个新的 ROI。这些按钮可以绘制线性或者圆弧 ROI,也可以删除 所有 ROI 或者查看 ROI 形状。一旦使用“绘制线段”或者“绘制圆弧”创建了一个 ROI, 那么轮廓线窗口中的创建 ROI 按钮会变成灰色,因为轮廓线窗口一次只能处理一个 ROI。

2.13.2 轮廓线显示 该工具的主要区域用于显示轮廓线:图像沿着 ROI 的灰度值轮廓线在该区域以蓝色曲线的 形式显示。 轮廓线窗口包含静态部分与可交互操作部分。 静态部分就是水平轴, 它代表 ROI 的长度(单位是像素) ,因此,它提供了沿着 ROI 的灰度值的位置。 轮廓线区域的动态部分是两条可以拖动的彩色直线。垂直的绿色线和红色线,分别表示沿 着 ROI 所选的最小位置和最大位置。这两条线也显示在活动图形窗口,通过“输出”的参 数对其可视化进行调整。另一个动态部分是垂直坐标轴,它显示图像的灰度值。对于字节 图像,其取值范围从 0 到 255。 初始化时,轮廓线显示在整个垂直范围,即达到峰值。在轮廓线左侧点击鼠标,你可以修 改显示的部分: 根据所选的区域,显示放大的轮廓。单击此按钮,在轮廓区域选择一个区域,放 大显示该轮廓。 水平分布轮廓线,只显示处于两条线之间区域。 显示完整的轮廓线。 重置垂直方向的显示轮廓。 重置水平方向的显示轮廓。 强制最小直方图宽度。调整窗口大小时,不调整轮廓线的宽度。 2.13.3 数据源 这一部分可以选择源图像并因此选择源 ROI。默认情况下,使用轮廓线窗口的 ROI 菜单在 活动的图形窗口中绘制 ROI。如果“测量助手”被激活,可以从下拉菜单中选择一个助手, 也可以通过激活“显示测量助手”按钮打开测量助手。 2.13.4 轮廓线参数 1. 平滑 显示平滑后的轮廓。在显示之前可以对轮廓进行平滑处理。使用平滑,先设置复选框为 Enabled,再用滑动条调节平滑因子。如果在“测量助手”中已经应用平滑处理,那么这些 值会被自动采用。也可以在轮廓线窗口进行平滑处理,与此同时,测量助手中的平滑处理 也会相应改变,如列下图所示:

2. 水平/垂直:通过在微调框输入最小值和最大值,来指定轮廓线的可视部分。当使用轮廓 线旁边的按钮来设置可视化区域时,这些值也会随之改变。也可以使用鼠标滚轮调整只显 示部分轮廓线,即“缩放”被激活时,可以缩放轮廓线。 每当轮廓窗口显示新图像数据时,这些值的调整取决于所选择的模式,该模式可独立地设 置水平和垂直范围: (1)自适应 对应的范围适合于新的值。 (2)渐增 只有增加时,相应的范围才会调整,也就是说,新的最小值变得更小,或新的最大值变得更 大,或两者兼有。 (3)固定 相应的范围始终不会变。 2.13.5 输出 输出部分可以选择当前活动 ROI 中显示的轮廓线的标记线。 可以选择线的颜色,长度以及宽 度。在一个图像中, 改变这些输出特性,可以达到最优的视觉效果。 2.13.6 统计 轮廓线窗口中“统计”部分显示了轮廓线上统计的数值。它包括位置数值(x 值)以及灰度 值。因此,很容易找到感兴趣的灰度值在哪里。那些灰度值包括: (1)峰值,标记了最 大灰度值的所在位置。 (2)范围,定义了 ROI 的长度以及沿着 ROI 的灰度值的范围 (3)最大值和最小值,确定上述绿线和红线位置和灰度值,也可以在活动窗中查看。 (4) 另外还有两个值,只涉及灰度值:平均值为平均灰度值, 而偏差是平均偏差。 2.13.7 相机聚焦:如何测试图像的清晰度 当你聚焦相机时,可以快速查看沿一条轮廓线的灰度值分布,用于查看图像边缘是否锐利 或者仍旧模糊。锐利的图像灰度值明暗变化剧烈,而模糊的图像灰度值明暗变化缓慢。 如下列图(图像引用自 HALCON 或 HDevelop)所示(左边是图像及轮廓线,右边是轮廓 线灰度分布图) :

3 HDevelop 语言 本章介绍了 HDevelop 语言的语法和语义, 描述了控制结构 (例如循环) 和参数传递的语义。 注意:本章不描述 HALCON 的内部算子。若想看内部算子的描述可以参看 HALCON 的参 考 手 册 。 本 章 节 所 有 应 用 的 例 子 也 能 在%HALCONEXAMPLES%\hdevelop\Manuals\Hdevelop 的路径下找到。 3.1 参数的基本类型 HALCON 分为两种数据:控制数据(数值或字符串)和图形数据(图像,区域,等等) 。 对输入参数和输出参数之间进一步区分,可以得到四种不同的参数。在 Hdevelop 参数列表 中这四种参数总是以同样的顺序出现,以下面的方式呈现: 算子名 ( 图形输入 : 图形输出 : 控制输入 : 控制输出 ) 正如你们都知道的那样,图形输入对象总是第一个传递,紧随其后的是图形输出对象。控 制数据在图形数据之后,并且输入参数在输出参数之前。 四类参数中的任何一类都可能为空。例如,算子 read_image: read_image(: Image : FileName :) read_image 算子有一个输出参数即图形对象 Image,还有一个输入控制参数 FileName。在 算子窗口键入算子名时会显示参数类型。调用的算子在 HDevelop 程序窗口中显示如下: read_image (Image, 'Name') 这些参数用逗号隔开。输入控制参数可以是变量、常量或表达式。表达式先求值,然后传 递给参数。图形参数必须是变量,控制输出参数也必须是变量,因为它们要用来存储算子 的求值结果。 3.2 控制类型和常量 在 HDevelop 中所有的非图形数据都用控制数据(数值或字符串)来表示。HDevelop 中的 控制参数可能包含算术或逻辑运算。一个控制数据项可以是下面类型中的一种:整数 integer、实数 real、字符串 string 和布尔类型 boolean。 3.2.1 整数 integer 和实数 real 整数和实数这两种类型的用法和 C 语言中的语法规则一样。整数数值可以以标准十进制计 数法输入,以十六进制计数法输入时要在数值前面加前缀 0x,以八进制计数法输入时要在 数值前面加前缀 0 来输入。例如: 4711 -123 0xfeb12 073421 73.815 0.32214 .56 -17.32e-122 32E19 整数类型和实数类型的数据项在机器内部的表示方法: 实数相当于 C 语言中的 double 类型 (8 个字节) ,整数相当于 C 语言中的 long 类型(4 或者 8 个字节) 。 3.2.2 字符串 string 字符串由在两个单引号(’)之间中的字符序列组成。字符串的最大长度被限制在 1024 个字 符。转义字符,像换行(类似于 c 语言中的符号表示) ,如下表(转义字符对照表)中所示

(对比 C 语言) 。 可以用\xnn 的格式输入任意的字符, 其中 nn 表示一个两位的十六进制数。 可以用\0nnn 的格式输入任意字符, 其中 nnn 表示一个三位的八进制数。 如果字符串是明确 的, 可以用更少的位数来描述。 例如, 如果字符串后面没有跟着另一个十六进制数值 (0-F) , 换行符可以用\xa 表示。 例如:字符串 Sobel's edge-filter 必须写为'Sobel\'s edge-filter'。一 个 Windows 路径可以写为'C:\\Programs\\MVTec\\Halcon\\images'。

3.2.3 布尔类型 boolean 常量 true 和 false 属于布尔类型。true 的值在内部用数值 1 表示,而 false 的值在内部用数 值 0 表示。这就意味着:表达式 Val := true 中 Val 的实际值是 1。一般而言,除了 0 以外的 每一个整数值都表示 true。请注意:一些 HALCON 的算子将逻辑值作为输入(例如: set_system) 。在这样的情况下,HALCON 算子需要像'true' 或 'false'这样的字符串常量而 不是布尔值 true 或 false。 3.2.4 常量 constant 和元组 tuple 除了上述通用类型以外,还有特殊常量(special constants)和元组类型(type tuple) ,这些 类型针对 HALCON 或者 HDevelop。 (1)常量 constant 使用一些常量作为算子的返回值(表示结果状态) ,这些常量可以和算子 dev_error_var 、 dev_set_check 一起用。这些常量代表一个算子的正常返回值,称之为信息。错误信息不能 反馈异常的具体内容(HDevelop 内部有超过 400 个(表示错误信息的)错误数值,具体的 错误信息可以从扩展的程序员手册(Extension Package Programmer's Manual)中查看) 。 算子的返回值和返回信息如下表所示:

(2)元组 tuple tuple,元组,也可以近似理解为数组。

控制类型仅仅在通用的 HDevelop 元组类型中使用。 一个元组可以由几种不同类型的数据 项组成。一个元组的标准表示是包含在括号( [ ])在内的所有元素的列表。元组常量的语 法如下图所示:

[]表示空元组。仅有一个元素的元组是一种特殊情况,它可以作为一个元组标记:[55]表 示一个与 55 相同的常量(即可以认为[55]等同于 55) 。元组示例如下: [] 4711 0.815 'Text' [16] [100.0,100.0,200.0,200.0] ['FileName','Extension'] [4711,0.815,'Hugo'] 3.3 变量 变量的命名与其他语言的命名是一样的,通常用字母、数字和下划线( '_')组成。变 量名的最大长度不能超过 256 个字符。一个变量的类型(图形或控制变量)取决于它在参 数列表中的位置,在这个位置可变标识符第一次使用(参见“参数的基本类型”部分) 。变 量的类型在输入算子参数时确定:当一个新的标识符出现时,对应的变量也随之产生。控 制变量和图形变量必须是不同的名字。图形变量和控制变量的初始值是不确定的,直到第 一次赋值,进行实例化操作才能确定。读取一个未定义的变量会导致运行错误。 HDevelop 提供了一个预定义的变量,命名为: _(下划线) 。可以使用该变量来作为 一个对输出值不感兴趣的输出控制参数。请注意:不允许使用这一变量来作为 HDevelop 的 特定操作符(HALCON 参考手册中的控制和开发章节) 。当程序要导出为其他的编程语言 时不建议使用变量_。 实例化的变量包含值的元组。数据项是图形对象还是控制数据取决于变量类型。元组 的长度由执行操作动态的确定。一个变量可以被赋值很多次,但一旦变量被赋值,变量就 会一直保持实例化的状态。选择菜单“执行=>重置程序执行” ,变量的内容会在下一次赋值 之前清除。 变量(控制数据和图形数据)第一次被粗略的赋值为不同变量类型,但数据的 实际类型(例如实数、整数、字符串等等)是未定义的,直到变量被分配一个具体的值才 确定实际类型。因此,新数据项与旧数据项的类型很有可能不同。 3.3.1 变量的作用域(局部或全局) HDevelop 支持局部变量和全局变量。所有的变量默认为局部变量,也就是,它们只存 在于它们的函数中。因此,不同函数的局部变量可以以相同的名字存在,而相互之间没有 干扰。与此相反,全局变量在整个程序中可以访问。全局变量必须使用算子 global 进行声

明。 例如: global tuple File 声明了一个全局控制变量 File 例如: global object Image 声明了一个全局的图形变量 Image。 关键字 def 允许在变量定义的地方标记一个显式声明,例如,global def object Image, 这只有在把 HDevelop 程序导出为一种编程语言时才有意义的。 有关更多信息,请参见 global 算子的描述。 全局变量一旦被声明, 它能够像局部变量一样在它被声明过的函数中被调用。 如果想要在另一个函数中访问全局变量,必须在该文件中声明该全局变量(如果不声明, 会产生一个局部变量) 。 主函数: * 声明全局变量 global tuple File global object Image ... File := 'particle' read_image(Image, File) process_image() * 全局图形变量 Image 在函数 process_image()中被更改 * 全局控制变量 File 在函数 process_image()中未被更改 ... process_image 函数: *使用全局函数 global object Image ... bin_threshold(Image, Region) File := 'fuse' read_image(Image, File) return() 因为函数必须显式的声明它使用的全局变量,在程序的其他部分使用全局变量不会 破坏当前的函数。 从本质上讲,在整个的 HDevelop 程序(也就是所有载入的外部程序、主函数和所有 的本地函数)中全局变量的名字必须是唯一的, 。 变量窗口提供了一个专门的标签页来列出当前已声明的所有的全局变量,如下图所 示:

3.4 图形对象的操作 图形对象由 HALCON 的算子专门处理。HALCON 的算子是在图形对象元组的基础 上工作的,这些算子的结果以元组(由图形对象或控制数据元素构成)的形式返回。对于 HALCON 算子的详细描述,请参考 HALCON 参考手册(HALCON reference manual)和 “基本元组操作” ( “Basic Tuple Operations” )这一章。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页