图像采集与基础操作

教学目标

  1. 掌握 Halcon 图像采集的基本方法(相机接口、实时采集)。
  2. 熟悉图像读写、显示与标注操作的语法与技巧。
  3. 能够通过 ROI(感兴趣区域)进行目标区域的提取与处理。
  4. 理解图像基础参数(分辨率、通道、位深)的概念与调试方法。

教学重点与难点

  • 重点:相机实时采集、图像显示与标注、ROI 操作。
  • 难点:相机参数配置、多线程采集优化、图像内存管理。

教学课时

  • 总时长:4 课时(每课时 45 分钟)
  • 分配
    • 第1课时:图像读取、保存与显示
    • 第2课时:相机接口与实时采集
    • 第3课时:图像标注与 ROI 操作
    • 第4课时:综合实验与调试技巧

教学准备

  1. 硬件:工业相机(如 Basler/USB 相机)、光源(可选)。
  2. 软件:Halcon 21.05+、相机驱动(如 GigE Vision Filter Driver)。
  3. 素材:本地图片(JPG/PNG)、实时采集测试图(棋盘格/零件图)。

教学内容与步骤

第1课时:图像读取、保存与显示

1.1 图像读写操作

  • 读取图像:支持格式(PNG、JPG、BMP 等)。
    1
    read_image(Image, 'D:/test/part01.png')  // 读取本地图像
  • 保存图像:指定路径与格式。
    1
    write_image(Image, 'png', 0, 'D:/result/output.png')  // 保存为 PNG

1.2 图像显示与窗口管理

  • 显示图像
    1
    2
    dev_open_window(0, 0, 800, 600, 'black', WindowHandle)  // 打开窗口
    dev_display(Image) // 显示图像
  • 窗口控制
    1
    2
    dev_set_window(WindowHandle)  // 激活指定窗口
    dev_close_window() // 关闭当前窗口

1.3 实验:图像加载与保存

  • 任务:读取本地图像并另存为 JPG 格式。
  • 代码示例
    1
    2
    3
    read_image(Image, 'chip.png')
    dev_display(Image)
    write_image(Image, 'jpeg', 80, 'chip_backup.jpg') // 质量参数 80

第2课时:相机接口与实时采集

2.1 相机接口类型

  • 常见协议
    • GigE Vision(千兆网相机)
    • USB3 Vision(USB 3.0 相机)
    • GenICam(通用接口标准)

2.2 实时采集流程

  1. 枚举相机设备
    1
    info_framegrabber('gige', 'device', [], [], Information)  
  2. 连接相机
    1
    open_framegrabber('gige', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'default', 'default', 'default', 0, -1, AcqHandle)  
  3. 采集单帧
    1
    2
    grab_image(Image, AcqHandle)  
    dev_display(Image)
  4. 连续采集
    1
    2
    3
    4
    while (true)
    grab_image(Image, AcqHandle)
    dev_display(Image)
    endwhile

2.3 实验:实时采集图像

  • 任务:连接相机并实时显示画面,按 Esc 键退出。
  • 代码示例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    open_framegrabber('gige', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'default', 'default', 'default', 0, -1, AcqHandle)
    dev_open_window(0, 0, 800, 600, 'black', WindowHandle)
    set_check('~give_error') // 忽略采集超时错误
    while (true)
    try
    grab_image(Image, AcqHandle)
    dev_display(Image)
    catch (Exception)
    break
    endtry
    endwhile
    close_framegrabber(AcqHandle)

第3课时:图像标注与 ROI 操作

3.1 图像标注

  • 绘制文本与图形
    1
    2
    3
    4
    dev_set_color('red')  
    dev_display(Image)
    disp_message(WindowHandle, 'Defect Found!', 'window', 12, 12, 'black', 'true') // 显示文本
    disp_circle(WindowHandle, 100, 100, 50) // 绘制圆

3.2 ROI(感兴趣区域)操作

  • 定义 ROI
    1
    2
    3
    gen_rectangle1(ROI, 200, 200, 400, 400)  // 生成矩形区域
    reduce_domain(Image, ROI, ImageReduced) // 裁剪 ROI 区域
    dev_display(ImageReduced)

3.3 实验:ROI 提取与标注

  • 任务:在图像中手动绘制矩形 ROI,提取区域并标注。
  • 代码示例
    1
    2
    3
    4
    5
    6
    7
    8
    dev_open_window(0, 0, 800, 600, 'black', WindowHandle)
    dev_display(Image)
    draw_rectangle1(WindowHandle, Row1, Column1, Row2, Column2) // 手动绘制
    gen_rectangle1(ROI, Row1, Column1, Row2, Column2)
    reduce_domain(Image, ROI, ImageROI)
    dev_clear_window()
    dev_display(ImageROI)
    disp_message(WindowHandle, 'ROI Area', 'window', 10, 10, 'blue', 'true')

第4课时:综合实验与调试技巧

4.1 综合实验:图像采集与处理流水线

  • 任务:实时采集图像 → 提取 ROI → 灰度化 → 保存结果。
  • 代码框架
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    open_framegrabber('gige', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'default', 'default', 'default', 0, -1, AcqHandle)
    dev_open_window(0, 0, 800, 600, 'black', WindowHandle)
    while (true)
    grab_image(Image, AcqHandle)
    rgb1_to_gray(Image, GrayImage) // 转为灰度图
    gen_rectangle1(ROI, 100, 100, 500, 500)
    reduce_domain(GrayImage, ROI, ImageROI)
    dev_display(ImageROI)
    write_image(ImageROI, 'png', 0, 'output_' + (timestamp()$'.3d') + '.png') // 按时间戳保存
    endwhile

4.2 调试技巧

  • 图像参数检查
    1
    2
    get_image_size(Image, Width, Height)     // 获取尺寸
    get_image_type(Image, Type) // 获取类型(byte/real)
  • 常见错误处理
    • 相机连接失败:检查 IP 地址、驱动、防火墙。
    • 采集卡顿:降低分辨率或启用硬件加速。

课后练习

  1. 基础任务:使用 USB 相机采集 10 张图像并保存到本地。
  2. 进阶任务:在实时视频流中动态绘制 ROI,仅处理 ROI 内区域。
  3. 挑战任务:设计交互式程序,允许用户选择 ROI 形状(矩形/圆形)。

注意事项

  1. 相机兼容性:不同品牌相机需安装对应的 GenICam 驱动。
  2. 资源释放:采集结束后使用 close_framegrabber 关闭句柄。
  3. 性能优化:避免在循环中频繁打开/关闭窗口。