图像采集与基础操作
图像采集与基础操作
教学目标
- 掌握 Halcon 图像采集的基本方法(相机接口、实时采集)。
- 熟悉图像读写、显示与标注操作的语法与技巧。
- 能够通过 ROI(感兴趣区域)进行目标区域的提取与处理。
- 理解图像基础参数(分辨率、通道、位深)的概念与调试方法。
教学重点与难点
- 重点:相机实时采集、图像显示与标注、ROI 操作。
- 难点:相机参数配置、多线程采集优化、图像内存管理。
教学课时
- 总时长:4 课时(每课时 45 分钟)
- 分配:
- 第1课时:图像读取、保存与显示
- 第2课时:相机接口与实时采集
- 第3课时:图像标注与 ROI 操作
- 第4课时:综合实验与调试技巧
教学准备
- 硬件:工业相机(如 Basler/USB 相机)、光源(可选)。
- 软件:Halcon 21.05+、相机驱动(如 GigE Vision Filter Driver)。
- 素材:本地图片(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
2dev_open_window(0, 0, 800, 600, 'black', WindowHandle) // 打开窗口
dev_display(Image) // 显示图像 - 窗口控制:
1
2dev_set_window(WindowHandle) // 激活指定窗口
dev_close_window() // 关闭当前窗口
1.3 实验:图像加载与保存
- 任务:读取本地图像并另存为 JPG 格式。
- 代码示例:
1
2
3read_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
info_framegrabber('gige', 'device', [], [], Information)
- 连接相机:
1
open_framegrabber('gige', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'default', 'default', 'default', 0, -1, AcqHandle)
- 采集单帧:
1
2grab_image(Image, AcqHandle)
dev_display(Image) - 连续采集:
1
2
3
4while (true)
grab_image(Image, AcqHandle)
dev_display(Image)
endwhile
2.3 实验:实时采集图像
- 任务:连接相机并实时显示画面,按 Esc 键退出。
- 代码示例:
1
2
3
4
5
6
7
8
9
10
11
12open_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
4dev_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
3gen_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
8dev_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
10open_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
2get_image_size(Image, Width, Height) // 获取尺寸
get_image_type(Image, Type) // 获取类型(byte/real) - 常见错误处理:
- 相机连接失败:检查 IP 地址、驱动、防火墙。
- 采集卡顿:降低分辨率或启用硬件加速。
课后练习
- 基础任务:使用 USB 相机采集 10 张图像并保存到本地。
- 进阶任务:在实时视频流中动态绘制 ROI,仅处理 ROI 内区域。
- 挑战任务:设计交互式程序,允许用户选择 ROI 形状(矩形/圆形)。
注意事项
- 相机兼容性:不同品牌相机需安装对应的 GenICam 驱动。
- 资源释放:采集结束后使用
close_framegrabber
关闭句柄。 - 性能优化:避免在循环中频繁打开/关闭窗口。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 广创科技教育-Blog!
评论