Halcon 第一章『Halcon语言』◆第2节:输入控制参数表达式(一)

        在HDevelop中,所有的算术表达式或字符串操作都被规定为输入控制参数,所有其它参数则必须属于变量类型。

        一、赋值运算Assignment

        在HDevelop中,赋值运算操作中必须进行赋值操作。

A:=Image

        输入为右值,结果为左值,它是将右边的输入值存储到左边的命名当中。

        而在C语言中赋值的形式是u = sin(x)+cos(y)

        而在HDevelop中是形式为:

        HALCON Operator Reference / Control

        给变量赋一个新值

assign( : : Input : Result)

        Input:输入参数,输入一个值。

        Result:输出参数,输出要存放Input值的变量。

assign(sin(x)+cos(y),u)

assign([1,2,3],Area)

        采用赋值操作方式为: 

u:=sin(x)+cos(y)

        HALCON Operator Reference / Control

        对元组元素赋值。(此算子已经属于老版本,用tuple_replace算子替代

insert( : : Input, Value, Index : Result)

        Input:输入参数,元组,必须插入新值。默认[]。

        Value:输入参数,必须插入的值。默认1。

        Index:输入参数,新值的索引位置,从0开始。默认0。

        Result:输出参数,输出赋值后的元组。

Area:=[1,2,3]
Value:=4
insert (Area, Value, 0, Result)

        Tuple / Manipulation

        替换元组中的一个或多个元素

tuple_replace( : : Tuple, Index, ReplaceTuple : Replaced)

Tuple:=[]
for i:=0 to 5 by 1
    Tuple[i]:=sqrt(real(i))
endfor
*结果为:Tuple:=[0.0, 1.0, 1.41421, 1.73205, 2.0, 2.23607]
read_image(Image, 'printer_chip/printer_chip_01')
threshold(Image, Region, 128, 255)
Areas:=[]
Row:=[]
for Index := 1 to 10 by 1
    dilation_circle(Region, RegionDilation, Index)
    area_center(RegionDilation, Area, Row, Column)
    Areas[Index-1]:=Area
    Row[Index-1]:=Row
endfor

        二、数组的基本操作

        数组的基本操作可能是一个或者多个数组进行操作,如合并数组或得到数组的元素个数等。

Tuple1 := [1,2,3,4,5]
Number := |Tuple1|
SingleElement := Tuple1[3]
Part := Tuple1[1:3]
Copy := Tuple1[0:|Tuple1| - 1]
*--------------------------------
tuple1:=[1,2,3,4,5]
a:=|tuple1|
b:=tuple1[1:3]
c:=tuple1[0:|tuple1|-1]

        注意:这些基本的操作不能针对图形数组进行操作,也就是说:图形不能从一个数组[]中被直接旋转,它们的数组个数不能用| |来决定,然而Halcon提供图像数组的函数操作。

         三、数组的创建 Tuple Creation

         1、简单的方式

*用算子进行分配操作
assign([],tuple1)
assign(123,tuple2)
assign([99,108],tuple3)
*用赋值操作进行操作
tuple1:=[]
tuple2:=123
tuple3:=[99,108]
*写入大量的元素
tuple:=[]
for i:=1 to 100 by 1
tuple:=[tuple,9999]
endfor

        2、gen_tuple_const构造函数

assign(gen_tuple_const(100,9999),tuple1)
tuple1:=gen_tuple_const(100,9999)

*对新的数组进行数学运算,先将所有元素乘以0,再加1234,并产生一个新的数组
assign((tuple_old*0)+1234,tuple_new)
tuple_new:=(tuple_old*0)+1234

        3、tuple_gen_const 算子

        HALCON Operator Reference / Tuple / Creation

        创建指定长度的元组,并初始化其元素

tuple_gen_const( : : Length, Const : Newtuple)

        Length:输入参数,要生成的元组长度。

        Const:输入参数,常量,用于初始化元组元素的值。

        Newtuple:输出参数,新数组的名称。

        四、基础的算数预算操作Basic Arithmeic Operations

        所有的运算操作都采用左值运算形式,除了右关联运算符以外,这些运算都采用从左到右的方式,但是,括号可以改变求值的顺序,有些操作符的优先级比其他操作符高。

        这些算术运算与平常的数学运算相类似,表达式能够有一些圆弧括号。

         这里的出发运算操作:如果两个数据中有一个是real类型,其返回的结果为real类型;如果两个元素都为integer类型,则结果为integer类型。也包括乘、加、减、负值,主要取决于两个数之间的类型是否有差异,其结果也会有所区别。

a:=4/3
b1:=-17/357  //有人会疑惑为什么结果会等于0
b2:=-17/357.0
c:=4/3.0
d:=(4/3)*2.0

         五、位运算操作Bit Operations

        位运算函数主要对位元进行操作,整个操作必须是整型变量操作。

Number := 128
LShift := lsh(Number,2)
RShift := rsh(Number,2)
Select := Number band 1
Select := 127 band 4
Set := 127 bor lsh(1,7)

        六.1、字符串操作String Operations

        有几种字符串操作可用于修改、选择和组合字符串。此外,一些操作允许将数字(实数和整数)转换为字符串。

        $(string conversion)//字符串转换,对应的算子为tuple_string

        $转换是从数字到字符串的转换,操作有两个数据元,$左边的是必须被转换的数字,$右边的是描述转换的内容或格式。

字符串操作

*====================================================================================
tuple_regexp_replace(['img10.bmp','img11.bmp','img12.bmp'], 'img(.*).bmp', 'out$1.txt', Result)
* Returns ['out10.txt','out11.txt','out12.txt']
*====================================================================================
tuple_regexp_select (['.','..','mydir','a.png','b.txt','c.bmp','d.dat'], '.(bmp|png)', Result)
* Returns ['a.png','c.bmp']
tuple_regexp_select (Files, ['training','invert_match'], Matches)
* Returns all file names that do *not* contain the string 'training'
*====================================================================================
tuple_regexp_test ('p10662599755', '[A-Z]*', Result)
* Returns 0
tuple_regexp_test ('p10662599755', ['[A-Z]*','ignore_case'], Result)
* Returns 1

         六.2、字符串的格式

        字符串格式由以下四部分组成: <flags><field width>.<precision><conversion characters>

        <flags>

- 转换的结果在字段内左对齐。
+ 有符号转换的结果总是以符号+或-开头。 
<space> 如果有符号转换的第一个字符不是符号,则在结果前加上空格字符。这意味着如果空格标志和+标志同时出现,空格标志将被忽略。
# 该值将被转换为“备用形式”。对于d和s转换,此标志无效。对于o转换(见下文),它增加精度以强制结果的第一个数字为零。对于x或x转换(见下文),非零结果以Ox或Ox为前缀。对于e、e、f、g和g转换,结果总是包含一个基数字符,即使基数字符后面没有数字。对于g和g转换,与通常的行为相反,最后的零不会从结果中删除。
0 该值应该填充为零。对于d, o, u, x, X, e, E, f, F, g和 G转换,转换后的值在左侧用零填充,而不是空白。如果o和-标志同时出现,o标志将被忽略。如果通过数字转换 (d, o, u, x和 X)给出精度,0标志将被忽略。对于其他转换,该行为是未定义的。

<field width>

        可选的十进制数字字符串,用于指定最小字段宽度。对于输出字段,如果转换后的值比字段宽度的字符数少,则在字段宽度的左侧(或右侧,如果给出了左侧调整标志-)填充。

.<precision>

        精度指定了 d, o, x或 X转换出现的最小数字数(该字段用前导零填充)、e和f转换出现在基数字符之后的数字数、g转换的最大有效数字数或s转换中从字符串打印的最大字符数。精度采用周期的形式。数值格式根据十进制字符数值保留,无效的位数则采用0填补。

<conversion characters>转换字符表示要应用的转换类型

d,u,o,x,X

整数参数以有符号十进制(d)、无符号十进制(u)、无符号八进制(o)或无符号十六进制(x和X)的形式显示。

x转换使用数字和小写字母:0123456789abcdef, X则表示转换使用数字和大写字母:0123456789ABCDEF,如果转换包含个数,且位数不够则前缀追加0的方式,否则会舍去对应的尾数。

参数的precision组件指定要显示的最小数字数。 如果转换的值可以用比指定的最小值更少的数字表示,则用前导零展开,默认精度为1,精度为0的零值转换的结果是没有字符。 

f

在转换过程表示为浮点数,样式为[-]ddd.ddd,如果前面没有[-],表示为后缀对应的方式,如果有则采用前缀对应的方式,如果参数中省略了精度,则输出6位数字;如果精度显式为0,则不出现基数。

比如后缀为6位的小数点,如果数据转换小数点不够,则追加0,如果小数点超过6位,则采用四舍五入的方式操作。

e,E 转换形式为指数形式:[-]d.ddd e+dd,前面为数值的内容,后面显示数值的指数大小。
g,G 浮点数的显示格式f或e,精度指定有效数字的个数。使用的样式取决于转换的值;样式e仅在转换产生的指数小于-4或大于或等于精度的情况下使用。从结果中删除尾随的零。基数字符只有在后跟数字时才会出现。
s 参数被接受为一个字符串,从字符串开始的字符被显示,直到达到字符串的结尾或参数的精度指定所指定的字符数为止。如果参数中省略了精度,则将其解释为无穷大,并打印字符串末尾之前的所有字符。
b 类似于s转换说明符,只是字符串可以包含反斜杠转义序列,然后将其转换为它们所表示的字符。

        在任何情况下,不存在或不足的字段宽度不会导致截断字段; 如果转换的结果比字段宽度宽,则只展开字段以包含转换结果。 

* '     23.00'
tuple_string (23, '10.2f', String1)
String1 := 23$'10.2f'
* '23.00     '
tuple_string (23, '-10.2f', String2)
String2 := 23$'-10.2f'
* '4.0000000'
tuple_string (4, '.7f', String3)
String3 := 4$'.7f'
* ' +1234.568'
tuple_string (1234.56789, '+10.3f', String4)
String4 := 1234.56789$'+10.3f'
* 'ff'
tuple_string (255, 'x', String5)
String5 := 255$'x'
* 'FF'
tuple_string (255, 'X', String6)
String6 := 255$'X'
* '00255'
tuple_string (0xff, '.5d', String7)
String7 := 0xff$'.5d'
* '     total'
tuple_string ('total', '10s', String8)
String8 := 'total'$'10s'
* 'total     '
tuple_string ('total', '-10s', String9)
String9 := 'total'$'-10s'
* 'tot       '
tuple_string ('total', '-10.3s', String10)
String10 := 'total'$'-10.3s'

         六.3、+(string concatenation) 

        字符(+)在操作中能将字符串和数字类型进行组合操作,如果需要的话,运算元首先被转换成字符串,至少有一个运算元是字符串,以便能够进行组合。

for i:=1 to 5 by 1
    read_image(Image,Name +i+.tiff)
endfor
*我们可以将两个字符进行组合操作,中间包含的数字索引可以采用循环的方式进行组合

猜你喜欢

转载自blog.csdn.net/qq_45336030/article/details/125712484