【Halcon例程】基于形状匹配的剃须刀片缺陷检测(含代码、图像数据集下载链接)

概述

在剃须刀生产中,为了保证刀片的质量,需要对刀片的齿状边缘进行检测。本程序使用 HALCON 实现了一个基于形状匹配的检测流程。它可以精准定位目标刀片,对刀片的牙齿宽度和间距进行测量,并检测牙齿缺失或宽度不足的问题。


1. 初始化与图像加载

功能描述

在程序的开始部分,我们需要读取模板图像(即标准的剃须刀刀片图像),为后续检测提供一个对比的“基准”。同时,初始化显示窗口以便观察图像和处理结果。

对应代码
* 关闭实时更新功能,加速程序执行
dev_update_off ()

* 读取模板图像 'razors1.png'
read_image (ModelImage, 'razors1.png')

* 获取模板图像的尺寸信息(宽度和高度)
get_image_pointer1 (ModelImage, Pointer, Type, 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_set_color ('cyan')       * 设置绘图颜色为青色
dev_set_draw ('margin')      * 设置仅绘制区域边框
dev_set_line_width (2)       * 设置绘图线宽为2像素

* 暂停程序运行,方便用户检查
stop ()
流程讲解

这部分代码的作用是加载模板图像,并设置显示窗口参数。这样我们可以看到完整的模板图像,并为后续操作提供一个基础。


2. 模板对象选择与模型创建

功能描述

为了检测刀片上的牙齿,需要选中图像中感兴趣的区域(ROI,Region of Interest)。在此基础上,生成形状匹配模型,用于在目标图像中找到类似的刀片。

对应代码
* 定义模板的感兴趣区域(ROI),包括两个矩形区域
Row1 := 46
Column1 := 57
Row2 := 79
Column2 := 94
gen_rectangle1 (ROIPart1, Row1, Column1, Row2, Column2)

* 第二个矩形区域,相对于第一个区域偏移一定距离
gen_rectangle1 (ROIPart2, Row1 + 364, Column1 + 13, Row2 + 364, Column2 + 13)

* 将两个矩形合并为一个整体区域
union2 (ROIPart1, ROIPart2, ModelROI)

* 计算模板区域的中心位置,用于后续对齐
area_center (ModelROI, Area, CenterROIRow, CenterROIColumn)

* 显示模板图像和选定的模板区域
dev_display (ModelImage)
dev_display (ModelROI)
stop ()

* 创建模型
reduce_domain (ModelImage, ModelROI, ImageROI)     * 限制处理范围为模板区域
create_generic_shape_model (ModelID)              * 创建通用形状模型
set_generic_shape_model_param (ModelID, 'num_levels', 4)        * 设置金字塔层数为4
set_generic_shape_model_param (ModelID, 'optimization', 'none') * 关闭优化功能
set_generic_shape_model_param (ModelID, 'contrast_high', 30)    * 设置高对比度阈值
train_generic_shape_model (ImageROI, ModelID)                   * 训练模型

* 获取模型的轮廓并显示
get_generic_shape_model_object (ModelContours, ModelID, 'contours')
hom_mat2d_identity (HomMat2DModelContours)                      * 初始化单位变换矩阵
hom_mat2d_translate (HomMat2DModelContours, CenterROIRow, CenterROIColumn, HomMat2DModelContours) * 平移轮廓至中心
affine_trans_contour_xld (ModelContours, ModelContoursTranslated, HomMat2DModelContours)

* 显示模板轮廓
dev_clear_window ()
dev_set_color ('blue')
dev_display (ModelContoursTranslated)
stop ()
流程讲解

这部分代码主要用于定义模板区域(ROI)并生成形状模型:

  1. 选定模板区域: 通过两个矩形标记模板刀片的位置。
  2. 模型生成: 使用选定的模板区域生成一个形状匹配模型。这个模型用来在目标图像中查找类似的刀片。

3. 创建测量区域

功能描述

定义两个测量区域,用于测量刀片牙齿的宽度和间距,并将这些测量区域平移到模板的中心,方便后续操作。

对应代码
* 定义测量矩形区域的参数
Rect1Row := 244
Rect1Col := 73
DistColRect1Rect2 := 17
Rect2Row := Rect1Row
Rect2Col := Rect1Col + DistColRect1Rect2
RectPhi := rad(90)
RectLength1 := 122
RectLength2 := 2

* 生成两个测量矩形
gen_rectangle2 (MeasureROI1, Rect1Row, Rect1Col, RectPhi, RectLength1, RectLength2)
gen_rectangle2 (MeasureROI2, Rect2Row, Rect2Col, RectPhi, RectLength1, RectLength2)

* 显示测量矩形区域
dev_display (ModelImage)
dev_set_color ('yellow')
dev_display (MeasureROI1)
dev_display (MeasureROI2)

* 平移测量区域到模板中心
get_system ('clip_region', OriginalClipRegion)
set_system ('clip_region', 'false')
move_region (MeasureROI1, MeasureROI1Ref, -CenterROIRow, -CenterROIColumn)
move_region (MeasureROI2, MeasureROI2Ref, -CenterROIRow, -CenterROIColumn)
set_system ('clip_region', OriginalClipRegion)
流程讲解

测量区域是用于实际检测刀片牙齿宽度的矩形区域。这里生成了两个矩形,一个对应刀片的一侧,另一个用于另一侧。然后将这些区域对齐到模板中心,方便在目标图像中匹配后使用。


4. 搜索目标图像并匹配模板

功能描述

读取目标图像(包含实际待检测刀片的图像),使用形状匹配模型定位目标刀片的位置。

对应代码
* 读取目标图像
read_image (SearchImage, 'razors2.png')
dev_display (SearchImage)

* 设置形状匹配参数
set_generic_shape_model_param (ModelID, 'min_contrast', 10)
set_generic_shape_model_param (ModelID, 'angle_start', 0.0)
set_generic_shape_model_param (ModelID, 'angle_end', 0.0)
set_generic_shape_model_param (ModelID, 'max_overlap', 0.0)
set_generic_shape_model_param (ModelID, 'min_score', 0.8)
set_generic_shape_model_param (ModelID, 'greediness', 0.7)

* 查找目标
find_generic_shape_model (SearchImage, ModelID, MatchResultID, NumMatchResult)

流程讲解

程序加载目标图像后,通过形状匹配模型,找到目标图像中所有与模板相似的刀片,并记录它们的位置。


5. 对每个匹配目标进行测量与缺陷检测

功能描述

对每个匹配到的刀片,平移测量区域到目标位置,并检测牙齿的宽度和间距。对牙齿宽度不足或间距异常的区域进行标记。

对应代码
for I := 0 to NumMatchResult - 1 by 1
    get_generic_shape_model_result (MatchResultID, Indices[I], 'row', RowCheck)
    get_generic_shape_model_result (MatchResultID, Indices[I], 'column', ColumnCheck)
    get_generic_shape_model_result (MatchResultID, Indices[I], 'angle', AngleCheck)

    * 平移测量区域
    vector_angle_to_rigid (0, 0, 0, RowCheck, ColumnCheck, AngleCheck, MovementOfObject)
    affine_trans_region (MeasureROI1Ref, MeasureROI1AtNewPosition, MovementOfObject, 'constant')
    affine_trans_region (MeasureROI2Ref, MeasureROI2AtNewPosition, MovementOfObject, 'constant')

    * 测量牙齿宽度
    measure_pairs (SearchImage, MeasureHandle1, 2, 25, 'negative', 'all', RowEdge11, ColEdge11, Amp11, RowEdge21, ColEdge21, Amp21, Width1, Distance1)
    
    * 检测缺陷
    if (NumberTeeth1 < 37)
        disp_rectangle2 (WindowHandle, RowFault, ColFault, 0, 4, 4)
endif
流程讲解

对每个匹配刀片的位置进行以下步骤:

  1. 平移测量区域到目标位置。
  2. 测量牙齿宽度及间距。
  3. 检测是否存在缺陷,例如牙齿宽度不足或缺失。

通过网盘分享的文件:剃须刀刀片检测
链接: https://pan.baidu.com/s/178dbHu1tLF2Pg5I2q_9_Tw?pwd=jkcf 提取码: jkcf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客晨风

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值