实例一(3d_coordinates.hdev):
for I := 1 to NumImages by 1
read_image (Image, 'calib/calib-3d-coord-'+I$'02d')——C:\Program Files\MVTec\HALCON-10.0\images\的calib文件夹中开头是calib-3d-coord-的图像。I$'02d'表示后面的数字是两位数,即0+‘I’。
实例二(3d_position_of_circles.hdev):
Dir := 'metal-parts'
for I := 1 to 5 by 1
read_image (Image, Dir + '/work_sheet_'+ I$'.2')
实例三(autobahn.hdev):
for i := 0 to 28 by 1
read_image (ActualImage, 'autobahn/scene_'+(i$'02'))
综合上面的几个实例我们可以看出I$'02d')相当于I$'.2'相当于(i$'02')
实例四(ball_seq.hdev):
ImageNames := 'die/'+['die_02','die_03','die_04','die_07']
read_image (Bond, ImageNames[0])
我把ImageNames[0]中的的0换成1读出的第一张图片就是die_03.png;换成2读出的第一张图片就是die_04.png;换成3读出的第一张图片是die_07.png。刚好与['die_02','die_03','die_04','die_07']里面的相对应。
实例五:
7.5.1 General Features of Tuple Operations——元组操作的一般特征
请注意,在所有以下表变量和常数已通过字母表示允许的数据类型取代。这些字母提供有关可能的限制,定义区域。字母和它们的意义列于表7.3。对这些符号的操作只能应用于指定的类型参数或表达式,返回一个结果。
符号名称i, a, l和s原子可以表示元组(元组长度为1)以及任意长度的元组。
integer:整数 arithmetic:算法 boolean:布尔体系 atomic:原子的
操作通常假设原子元组描述。如果数组包含多个元素,大多数操作的工作方式如下:
1、如果一个元组的长度为1,其他的元组中的所有元素相结合,与所选择的操作该单一值;
如果两个元组具有的长度大于1,这两个元组必须具有相同的长度(否则会发生运行时错误)。在这种情况下,所选择的操作适用于所有具有2、相同索引的元素。由此产生的元组的长度是相同的输入元组的长度;
3、如果一个元组的长度为0([]),运行时错误发生。
在表7.4中,你可以找到一些例子进行算术运算元组。要特别注意的顺序执行字符串串联。 HDevelop基本的算术运算符号是+, - ,*,/。 但+是一种二态操作,请注意:如果两个操作数都是数字,它增加了数字。如果至少有一个操作数是一个字符串,它连接两个操作数为字符串。
7.5.2 Assignment——任务
HDevelop ,assignment就是一个操作。要使用assignment,你必须用(Input, Result)的形式。这个操作符具有以下语义: Input (assignment的右侧) ,并将其存储在Result(assignment的左侧)中 。然而,在程序文本中的分配代表赋值运算符通常的语法为Result := Input。下面的例子概括assignment在HDevelop与 C的语法和转换版本之间的差异:
分配在C语法
u = sin(x) + cos(y)
HDevelop使用赋值运算符中定义
assign(sin(x) + cos(y), u)
这是在程序窗口中显示
u := sin(x) + cos(y)
如果该表达式的结果并不需要被存储到一个变量中,可以直接使用表达式的任何运算符作为输入值。但只要所得值需要多次使用或变量必须初始化就要用assignment(例如,一个循环)。
第二个赋值运算符是 insert(Input, Value, Index, Result) 。它被用来分配的元组元素。如果第一个输入参数,和第一输出参数是相同的,该呼叫
insert (Areas, Area, Radius-1, Areas)
作为一个操作调用的程序文本中未显示,但在更直观的形式为:
Areas[Radius-1] := Area
举一个例子:
assign([1,2,3], Area)
assign(9, Areas)
insert(Areas, Area, 1, Areas)
设置Areas为[ 1,9,3 ]
为了通过insert构造一个元组,通常是一个空的元组作为初始值,并在一个循环中插入元素:
Tuple := []
for i := 0 to 5 by 1
Tuple[i] := sqrt(real(i))
endfor
正如你可以看到的例子,一个元组的指数从0开始。一个元组的一个插入,也可以以下列方式添加到元组的`back'或'front'。元组串联操作,可以用上逗号‘,’。在这里,操作assign 可用下面的代替:
assign([Tuple,NewVal],Tuple)转换为 Tuple := [Tuple,NewVal]
如果索引的位置是介于两者之间,已使用插入操作。它需要输入以下参数:首先应插入新值的元组,然后将新值作为第三个输入参数的索引位置。得到的结果(第四个参数)与输入的元组几乎是相同的,除了上面的定义的索引位置的新值(见上面的例子)。
在下面的示例中,区域通过圆扩张,并和之后的区域被存储到元组区。在这种情况下,插入操作被使用。
read_image (Mreut, 'mreut')
threshold (Mreut, Region, 190, 255)
Areas := []
for Radius := 1 to 50 by 1
dilation_circle (Region, RegionDilation, Radius)
area_center (RegionDilation, Area, Row, Column)
Areas[Radius-1] := Area
endfor
请注意,第一,变量区域必须进行初始化,以避免运行时错误。在这个例子中地区被初始化为空的元组([]) 。而不是插入操作分配与元组串联
Areas := [Areas,Area]
可以使用,因为该元素附加在后面的元组中。更多的例子可以在程序assign.dev中发现 。
7.5.3 Basic Tuple Operations——基本元组操作
一个基本的元组操作可选择一个或多个值,结合元组(级联)或得到的元素数(见表7.5作业对含有控制数据的元组)。注意:[[t]] = [t] = t
|t|返回一个元组元素的数目。从零到元素数减一的元素范围的指标(即|t|-1)。因此,选择指数必须在此范围内。(请注意对象的指标(例如,select_obj)从1到元素的编号范围。)
Tuple := [V1,V2,V3,V4]
for i := 0 to |Tuple|-1 by 1
fwrite_string (FileHandle,Tuple[i]+'\n')
endfor
在下面的例子中,该变量包含[2,2,3,'a','a',2,3,'b','b']:
进一步的例子可以在程序tuple.dev中发现。HALCON算子对应的基本元组操作列于表7.5。
请注意,这些直接操作不能用于标志性的元组,即,标志性的对象不能从一个元组使用[ ],其数量不能使用| |直接测定。然而,为了这个目的,HALCON操作提供执行相应的任务。表7.6中你可以看到元组操作控制数据的工作(这是通过assign or insert)。表中符号t表示控制元组,符号p和q代表符号元组。
7.5.4 Tuple Creation——元组创建
assign ([],empty_tuple) empty:=[]
assign (4711,one_integer) 显示为 one_integer := 4711
assign ([4711,0.815],two_numbers) two_numbers := [4711,0.815]
assign ([],tuple) tuple := []
for (1,100,1,i) 显示为 for i := 1 to 100 by 1
assign ([tuple,4711],tuple) tuple := [tuple,4711]
endfor endfor
因为这不是很方便的一个特殊功能称为gen_tuple_const是可构造一个元组,一个给定的长度,其中每个元素具有相同的值。使用此功能,从上面的程序被简化为:
assign(gen_tuple_const(100,4711),tuple) 显示为 tuple := gen_tuple_const(100,4711)
如果我们要构建一个元组相同的长度为一个给定的元组得到一个简单的解决方案有两种方法,第一种是基于gen_tuple_const
assign(gen_tuple_const(|tuple_old|,4711),tuple_new) 显示为 tuple_new := gen_tuple_const(|tuple_old|,4711)
第二个是有点棘手,使用算术运算功能:
assign((tuple_old * 0) + 4711,tuple_new) 显示为 tuple_new := (tuple_old * 0) + 4711
在这里,我们得到第一个元组具有相同的长度与每一个元素设置为零。然后,我们添加常数的每个元素。在具有不同值的元组的情况下,我们必须使用循环版本的值分配到每个位置:
assign([],tuple)
for (1,100,1,i)
assign([tuple,i*i],tuple)
endfor
which is displayed as
tuple := []
for i := 1 to 100 by 1
tuple := [tuple,i*i]
endfor
在这个例子中,我们构造一个元组,从12到1002的平方值。
7.5.5 Basic Arithmetic Operations——基本算术运算
提供基本的算术运算的概述,请参阅表7.7。所有的操作都是左结合的,除了右结合元负运算符。赋值通常是从左至右进行。但是,括号可以改变赋值的顺序和一些操作有比别人更高的优先级(参见“7.5.14”)
HDevelop中的算术运算符合通常的定义。表达式可以有任意数量的括号。
除法运算符(A1/ A2)可以应用到整数以及实数。如果其结果是实数类型,则至少有一个操作数是实数类型。如果两个操作数都是整数类型,操作是一个整数除法。其它的算术运算符(乘法,加法,减法,和否定),可以适用于任一整数或实数。如果至少有一个操作数是实数,其结果将是一个实数。示例:
例子可以在arithmetic.dev中找到
7.5.6 Bit Operations——位操作
本节介绍了用于处理位数字的操作。运算数必须是整数。
7.5.7 String Operations——字串操作
有几个字符串操作,可修改,选择,和组合字符串。此外,有些操作允许转换成数字(实数和整数)为字符串。
concatenate:联系、连接 substring:子链
$(字符串转换)
$将数字转换为字符串或修改字符串。操作有两个操作数:第一个($左边)是数字,已被转换。第二个($右边)指定的转换。这是类似于C语言编程的printf()函数格式字符串。这个格式字符串由以下四个部分组成
:
<flags><width>.<precision><conversion>这个也可以用[-+ #]?([0-9]+)?(\.[0-9]*)?[doxXfeEgGsb]?表示
(这大致可以转换为零或更多的字符在第一支架对后跟零个或更多位数,任选一个点可以跟着数字后跟从最后一架双转换字符)
<flags>
零个或多个标记,以任何顺序,它修改的转换规格的意义。旗标可以包含下列字符:
—:转换的结果是左对齐的领域内。
+:一个符号转换的结果总是开始于一个标志,+或—。
<space>:如果一个符号转换的第一个字符是不是一个符号,空格是r前缀
#该值将转换为“交替形式”。d和s(见下文)的转换,这标志是无效。o转换(见下文),它增加了精密力结果的第一个数字是零。x或X转换(见下文),一个非零的结果有0x或0X做前缀。e,E,f,g,G转换,结果总是包含一个基数字符。g和G转换,尾随零不是从结果中删除,相反,与平常不同。
<width>
指定一个最小字段宽度的小数位数的可选字符串。一个输出字段,如果转换后的值的字符比字段宽度减少,它是在左边(或右,如果左调整标志了)的字段宽度。
<precision>
字符串串联(+)可以应用于字符串或数值类型组合;如有必要,先被转化成字符串运算数(根据他们的标准表示)。至少一个操作数必须是一个字符串,已经使操作者可以作为一个字符串的concatenator。在下面的例子中的一个文件的名称(例如'Name5.tiff')。为了这个目的,两个字符串常量('name' '和'tiff’)和一个整数(循环指数i)连接:
for i := 1 to 5 by 1
read_image (Image, 'Name'+i+'.tiff')
endfor
7.5.8 Comparison Operations——比较运算
7.5.9 Boolean Operations——布尔运算
布尔运算and, xor, or,以及not(和、异、或,否)只是长度的1元组定义。7.5.10 Trigonometric Functions——三角函数
7.5.11 Exponential Functions——幂指数功能
7.5.12 Numerical Functions——数值计算功能
7.5.13 Miscellaneous Functions——杂项功能
random:任意、随机 inverse:倒转、相反 ord——order chr——character
chrt——CHR+Tuple rand——random sort:排列 reverse:反转、调换
7.5.14 Operation Precedence——运算优先级
原文链接:http://k594081130.blog.163.com/blog/static/21835901320138923731316/