Halcon 基础语法

教学目标

  1. 理解 Halcon 的基本数据类型及其应用场景。

  2. 掌握 Halcon 变量定义、运算符及控制语句的语法规则。

  3. 能够编写简单的 Halcon 脚本完成图像处理任务。

教学重点与难点

  • 重点:数据类型(Image/Region/XLD)、控制语句、函数调用。
  • 难点:动态类型机制、集合操作符、函数参数传递规则。

教学课时

  • 总时长:4 课时(每课时 45 分钟)
  • 分配
    • 第1-2课时:数据类型与变量操作
    • 第3课时:控制语句与运算符
    • 第4课时:函数与过程调用

教学准备

  1. 软件环境:安装 Halcon 21.05+ 和 HDevelop。
  2. 示例图片:提供工业零件图(如齿轮、电路板)。
  3. 代码示例:准备基础语法演示脚本。

教学内容与步骤

第1-2课时:数据类型与变量操作

1.1 Halcon 核心数据类型

  • 图像(Image)

    • 单通道(灰度图)与多通道(彩色图)。
    • 示例代码:
      1
      2
      3
      read_image(Image, 'part01.png')  // 读取图像
      get_image_size(Image, Width, Height) // 获取尺寸
      dev_display(Image) // 显示图像
  • 区域(Region)

    • 表示图像中的连通区域,用于目标提取。
    • 示例代码:
      1
      2
      threshold(Image, Region, 128, 255)  // 阈值分割得到区域
      connection(Region, ConnectedRegions) // 连通域分析
  • 轮廓(XLD)

    • 亚像素精度的轮廓,用于边缘检测和几何测量。
    • 示例代码:
      1
      edges_sub_pix(Image, Edges, 'canny', 1, 20, 40)  // 提取亚像素边缘

1.2 变量与运算符

  • 变量定义

    • 动态类型:变量无需声明类型,根据赋值自动确定。
    • 命名规则:字母开头,可包含数字和下划线(如 Region1)。
  • 运算符

    • 算术运算符:+, -, *, /
    • 关系运算符:==, >, <, !=
    • 逻辑运算符:and, or, not
    • 集合运算符:union(并集), difference(差集)
    • 示例:
      1
      2
      Area := 100  
      IsLarge := Area > 50 // 结果为 true

1.3 实验:图像与区域操作

  • 任务:读取图像并提取面积大于 100 像素的区域。
  • 代码示例
    1
    2
    3
    4
    5
    read_image(Image, 'chip.png')
    threshold(Image, Region, 100, 255)
    connection(Region, ConnectedRegions)
    select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 100, 99999)
    count_obj(SelectedRegions, Number)

第3课时:控制语句与运算符

2.1 控制语句

  • 条件语句(if/else)

    1
    2
    3
    4
    5
    if (Number > 0)
    dev_display(SelectedRegions)
    else
    print('未找到目标区域')
    endif
  • 循环语句(for/while)

    1
    2
    3
    4
    5
    // 循环处理多张图像
    for Index := 1 to 5 by 1
    read_image(Image, 'part_' + Index$'.2d')
    process_image(Image)
    endfor

2.2 实验:循环处理图像

  • 任务:批量读取 5 张图片并统计每张图的区域数量。
  • 代码示例
    1
    2
    3
    4
    5
    6
    7
    for Index := 1 to 5 by 1
    read_image(Image, 'image_' + Index$'02d')
    threshold(Image, Region, 128, 255)
    connection(Region, ConnectedRegions)
    count_obj(ConnectedRegions, NumRegions)
    print('图像 ' + Index + ' 区域数:' + NumRegions)
    endfor

第4课时:函数与过程调用

3.1 函数定义与调用

  • 函数定义:使用 procedure 关键字。

    1
    2
    3
    procedure calculate_area(Region: InputRegion, Area: out)
    area_center(InputRegion, Area, Row, Column)
    endprocedure
  • 参数传递

    • 输入参数(in)、输出参数(out)、输入输出参数(inout)。
    • 示例调用:
      1
      2
      calculate_area(SelectedRegions, TotalArea)
      print('总面积:', TotalArea)

3.2 错误处理

  • try/catch 语句:捕获运行时错误。
    1
    2
    3
    4
    5
    try
    read_image(Image, 'missing_file.png')
    catch (Exception)
    print('错误:文件未找到!')
    endtry

3.3 实验:自定义函数

  • 任务:编写函数计算图像的平均灰度值。
  • 代码示例
    1
    2
    3
    4
    procedure get_mean_gray(Image: in, MeanValue: out)
    get_grayval(Image, 100, 100, GrayValue) // 示例简化逻辑
    MeanValue := GrayValue
    endprocedure

课后练习

  1. 编写脚本,提取图像中所有圆形区域并计算其半径。
  2. 使用循环语句实现图像的批量滤波(如高斯滤波)。
  3. 设计一个函数,判断区域是否为矩形(长宽比接近1)。

注意事项

  1. Halcon 变量名区分大小写(如 Imageimage 不同)。
  2. 调试技巧:使用 dev_displaydisp_message 实时观察变量状态。
  3. 常见错误:未加载图像时直接调用图像处理算子。