Halcon例程代码解读:安全环检测(附源码|图像下载链接)
安全环检测核心思路与代码详解
项目目标
本项目的目标是检测图像中的安全环位置和方向。通过形状匹配技术,从一张模型图像中提取安全环的特征,并在后续图像中识别多个实例,完成检测和方向标定。
实现思路
安全环检测分为以下核心步骤:
- 模型图像加载与处理: 读取包含安全环的模型图像,并定义感兴趣区域 (ROI),以减少背景干扰。
- 形状模型创建: 基于感兴趣区域提取特征,训练通用形状模型(Generic Shape Model)。
- 目标匹配检测: 在待检测图像中搜索安全环,输出位置、方向和检测结果。
- 结果可视化: 通过绘制轮廓和方向箭头,直观展示安全环的位置和方向信息。
代码讲解
以下是完整代码的逐步解析,重点放在每个步骤的核心功能和逻辑。
1. 初始化
* 关闭窗口更新以优化性能
dev_update_window ('off')
* 加载模型图像
read_image (ModelImage, 'image/rings_01')
* 获取图像尺寸
get_image_size (ModelImage, Width, Height)
* 打开窗口并设置显示区域
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'white', WindowHandle)
dev_set_part (0, 0, Height - 1, Width - 1)
* 显示模型图像
dev_display (ModelImage)
- 核心功能:
- 关闭窗口更新 (
dev_update_window ('off')
) 以提高运行性能。 - 读取模型图像并获取图像尺寸,为后续显示做准备。
- 打开一个适配图像尺寸的显示窗口。
- 关闭窗口更新 (
2. 定义感兴趣区域 (ROI)
* 设置安全环的ROI
Row := 251
Column := 196
Radius := 103
* 创建圆形区域作为ROI
gen_circle (ModelROI, Row, Column, Radius)
* 显示ROI
dev_display (ModelROI)
- 核心功能:
- 使用
gen_circle
函数定义圆形区域,圈定包含安全环的区域。 - 通过 ROI 减少背景干扰,确保模型训练的准确性。
- 使用
3. 检查并创建形状模型
检查模型区域
* 裁剪图像,仅保留ROI部分
reduce_domain (ModelImage, ModelROI, ImageROI)
* 检查ROI的形状特征
inspect_shape_model (ImageROI, ShapeModelImage, ShapeModelRegion, 1, 30)
* 显示检查结果
dev_clear_window ()
dev_display (ShapeModelRegion)
- 核心功能:
- 使用
reduce_domain
裁剪图像,只保留 ROI。 - 调用
inspect_shape_model
检查模型区域的形状特征,确保模型质量。
- 使用
创建形状模型
* 创建并训练通用形状模型
create_generic_shape_model (ModelID)
set_generic_shape_model_param (ModelID, 'metric', 'ignore_global_polarity')
train_generic_shape_model (ImageROI, ModelID)
* 提取模型轮廓
get_generic_shape_model_object (ShapeModel, ModelID, 'contours')
- 核心功能:
- 调用
create_generic_shape_model
创建模型,随后通过train_generic_shape_model
基于 ROI 图像训练模型。 - 设置模型参数
ignore_global_polarity
,忽略极性变化,增强鲁棒性。
- 调用
4. 目标匹配与检测
* 设置形状匹配参数
set_generic_shape_model_param (ModelID, 'max_overlap', 0.55)
set_generic_shape_model_param (ModelID, 'min_score', 0.4)
* 遍历待检测图像
for i := 1 to 7 by 1
read_image (SearchImage, 'image/rings_' + (i + 1)$'02')
dev_display (SearchImage)
* 进行形状匹配
find_generic_shape_model (SearchImage, ModelID, MatchResultID, NumMatchResult)
* 如果检测到物体
if (NumMatchResult > 0)
set_tposition (WindowHandle, 20, 24)
write_string (WindowHandle, '检测到目标数量:'+NumMatchResult)
* 遍历所有检测结果
for j := 0 to NumMatchResult - 1 by 1
* 获取目标轮廓
get_generic_shape_model_result_object (Objects, MatchResultID, j, 'contours')
dev_set_color ('cyan')
dev_display (Objects)
* 获取位置和方向信息
get_generic_shape_model_result (MatchResultID, j, 'row', Row)
get_generic_shape_model_result (MatchResultID, j, 'column', Column)
get_generic_shape_model_result (MatchResultID, j, 'hom_mat_2d', HomMat2D)
* 计算方向箭头终点
affine_trans_pixel (HomMat2D, -120, 0, RowArrowHead, ColumnArrowHead)
dev_set_color ('blue')
disp_arrow (WindowHandle, Row, Column, RowArrowHead, ColumnArrowHead, 2)
endfor
else
* 未检测到目标
set_tposition (WindowHandle, 20, 20)
write_string (WindowHandle, '未检测到物体!')
endif
endfor
- 核心功能:
- 目标匹配:
- 使用
find_generic_shape_model
在每张图像中搜索目标。 - 匹配结果包括目标数量、位置(行、列坐标)和方向(仿射矩阵)。
- 使用
- 显示检测结果:
- 高亮显示目标轮廓,并绘制箭头标注方向。
- 若检测不到目标,则显示“未检测到物体”的提示。
-
- 目标匹配:
5. 清理资源与结束程序
* 恢复窗口更新
dev_update_window ('on')
* 清理形状模型
clear_shape_model (ModelID)
- 核心功能:
- 恢复窗口更新。
- 释放形状模型资源,避免内存占用。
项目核心思路总结
-
模型训练:
使用感兴趣区域提取安全环的形状特征,生成通用形状模型。 -
多图像匹配:
遍历多张待检测图像,利用形状模型进行目标匹配,输出目标位置和方向信息。 -
结果可视化:
通过高亮轮廓和绘制箭头,直观展示安全环的位置与方向。
适用场景
该项目适用于以下应用场景:
- 工业生产中的零件检测: 如汽车轮毂、机械零件中的环状目标检测。
- 视觉质量控制: 检测物体位置和方向是否符合预期。
代码与资源
通过网盘分享的文件:安全环
链接: https://pan.baidu.com/s/1gAHHtwL53Sow00jUHD_Z2g?pwd=jkcf 提取码: jkcf