概述
在剃须刀生产中,为了保证刀片的质量,需要对刀片的齿状边缘进行检测。本程序使用 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)并生成形状模型:
- 选定模板区域: 通过两个矩形标记模板刀片的位置。
- 模型生成: 使用选定的模板区域生成一个形状匹配模型。这个模型用来在目标图像中查找类似的刀片。
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
流程讲解
对每个匹配刀片的位置进行以下步骤:
- 平移测量区域到目标位置。
- 测量牙齿宽度及间距。
- 检测是否存在缺陷,例如牙齿宽度不足或缺失。
通过网盘分享的文件:剃须刀刀片检测
链接: https://pan.baidu.com/s/178dbHu1tLF2Pg5I2q_9_Tw?pwd=jkcf 提取码: jkcf