← 全部文章 机器视觉

HDevelop 的语法:变量、元组、判断和循环

2023 年 3 月 4 日 · 2 分钟读完

目录
  1. 变量的创建与赋值
  2. 元组(tuple)
  3. if 语句
  4. for 循环
  5. while 循环
  6. 中断语句
  7. switch 语句
  8. 和 C# 的对照
  9. 延伸

在 HDevelop 里写程序时,有些语法和 C# 差别挺大,记录一下。

变量的创建与赋值

HDevelop 里变量不用提前声明。调用算子时,输出参数会自动创建对应的变量,比如调用 read_image 后,变量窗口里自动多了一个图像变量 Image:

赋值用 :=(单个 = 是比较):

* 星号开头是注释
read_image (Image, 'printer_chip/printer_chip_01')
Threshold := 128
Name := 'chip'

图像变量也可以直接赋值:

read_image (Image, 'printer_chip/printer_chip_01')
CopyImage := Image

元组(tuple)

控制变量本质上都是元组,单个数字也是长度为 1 的元组。

T := [1, 2, 3]
T := [T, 4]            * 拼接:[1, 2, 3, 4]
N := |T|               * 长度:4
First := T[0]          * 下标从 0 开始
Sub := T[1:2]          * 切片:[2, 3]
T[0] := 10             * 修改某一项
Mixed := [1, 'a', 2.5] * 一个元组里可以混放不同类型

很多运算对元组逐项进行,比如 [1, 2, 3] * 2 得到 [2, 4, 6],不用写循环。

if 语句

if (Area > 1000)
    Result := 'big'
elseif (Area > 100)
    Result := 'middle'
else
    Result := 'small'
endif

比较运算符:= 或 == 等于,!= 或 # 不等于,<、>、<=、>=;逻辑运算符是单词:and、or、not、xor。

for 循环

for Index := 0 to 9 by 1
    * 循环体
endfor

to 后面的终值是包含在内的,上面会执行 10 次(0 ~ 9)。by 后面是步长,每次循环后给变量加多少,可以是负数(倒着数)。遍历元组时常写成:

for I := 0 to |T| - 1 by 1
    Value := T[I]
endfor

循环开始时终值就固定了,在循环体里改 |T| 不会影响循环次数。

while 循环

I := 0
while (I < 10)
    I := I + 1
endwhile

还有先执行后判断的 repeat ... until (条件)。

中断语句

  • break:跳出当前循环;
  • continue:跳过本次,进入下一次循环;
  • return ():从当前过程(procedure)返回;
  • stop ():程序在这里暂停,方便调试时查看变量。

switch 语句

switch (Mode)
case 0:
    Result := 'zero'
    break
case 1:
case 2:
    Result := 'one or two'
    break
default:
    Result := 'other'
endswitch

case 只能是整数常量。和 C 语言一样,case 之间没有 break 时会接着往下执行:

ret := ''
index := 1
switch (index)
case 1:
    ret := ret + '1'
case 2:
    ret := ret + '2'
case 3:
default:
    ret := ret + 'df'
endswitch

从 case 1 进去,一路执行到 default,结果是 '12df':

和 C# 的对照

HDevelop C#
赋值 := =
等于 = 或 == ==
不等于 != 或 # !=
逻辑 and、or、not &&、||、!
注释 * 开头 //
字符串 单引号 'abc' 双引号 "abc"
数组长度 |T| T.Length
块结束 endif、endfor、endwhile }
整除 7 / 2 = 3(两个整数) 同左

延伸

  • 异常处理:try ... catch (Exception) ... endtry,Exception 是一个元组,第一项是错误码。没有 try 时,算子出错程序直接停下。
  • 过程(procedure):相当于函数。选中一段代码右键「创建新过程」,自动分析出输入输出参数;可以保存成外部 .hdvp 文件在多个程序间共用。
  • 导出 C#:文件 → 导出,生成的代码里每个算子都对应 HOperatorSet.Xxx(...),循环和判断会翻译成 C# 语法;元组运算会变成 HTuple 的方法调用,读起来比较啰嗦。转换时常用的类型操作见 Halcon 在 C# 里的数据类型转换。
  • 入门:算子签名里的冒号、读图和开窗口见 Halcon 入门。

# Halcon

原文首发于 blog.csdn.net