一、代码主要思路为
-
初始化和模型创建:
- 首先,通过读取一个示例图像
razors1
,选择一个包含剃须刀片的区域作为模板,并计算该区域的质心。这一步是为后续的形状模型创建准备模板对象。 - 使用选定的区域,通过
create_generic_shape_model
创建一个通用形状模型(Generic Shape Model)。接着,设置模型的一些参数,如金字塔层数(num_levels
)、优化方法(optimization
)、对比度阈值(contrast_high
)等,并使用train_generic_shape_model
对模型进行训练。这样,模型就学会了剃须刀片的典型特征。
- 首先,通过读取一个示例图像
-
测量区域定义:
- 定义了两个矩形区域(
MeasureROI1
和MeasureROI2
),这些区域对应于剃须刀片上需要测量的部分,例如刀刃间的距离或宽度。这些测量区域会在找到的每个刀片上应用,以检查其尺寸是否符合标准。
- 定义了两个矩形区域(
-
形状匹配和测量:
- 读取另一张待检测的图像
razors2
,并在其中查找与模型匹配的对象。通过find_generic_shape_model
执行形状匹配,寻找图像中与模型相似的剃须刀片。 - 对于每个找到的匹配项,代码计算一个仿射变换矩阵,将模型轮廓和测量区域映射到匹配对象的位置。这里提供了两种方式来获取变换矩阵,并展示了如何通过变换后的测量区域来测量剃须刀片的特性,比如刀片间的距离。
- 使用
measure_pairs
函数对每把刀片上的测量区域进行边缘检测,进而计算出刀片间“牙齿”的数量和间距,以此来判断刀片的质量是否合格。如果发现间距异常(超过4.0单位),则标记该位置为缺陷,并在图像上显示红色矩形提示。
- 读取另一张待检测的图像
-
结果展示和交互:
- 在匹配和测量过程中,使用了多个
stop
命令,这通常是在Halcon的交互式开发环境(HDevelop)中用于暂停程序执行,以便用户可以查看当前处理结果并进行交互。 - 最后,程序输出一条结束信息,并通过
dev_update_on
重新启用窗口更新,允许用户查看最终的处理结果。
- 在匹配和测量过程中,使用了多个
通过形状匹配技术自动定位图像中的剃须刀片,然后通过预定义的测量区域对刀片的关键尺寸进行精确测量,从而实现对产品质量的自动检测和缺陷识别。
二、具体代码注释如下
* ------------------------------------------------------------------------------------------------
* This example program uses shape-based matching to align ROIs for the measure
* tool, which then inspects individual razor blades.
* The program can be run in two modes:
* (1) with the full affine transformation
* (2) using translate_measure
* Modify the next line to switch between the modes.
*本示例程序使用基于形状的匹配来对齐测量工具的ROI,以检查个别剃刀片。
* 该程序可以在两种模式下运行:
* (1) 使用完整的仿射变换
* (2) 使用translate_measure
* 修改下一行以在模式之间切换
USING_TRANSLATE_MEASURE := 0
* ------------------------------------------------------------------------------------------------
* General configuration of HDevelop.
* HDevelop的通用配置
dev_update_off ()
read_image (ModelImage, 'razors1')
* 获取图像指针及其参数
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)
stop ()
* ------------------- Start of the application ----------------
* Select the model object.
* 选择模型对象
Row1 := 46
Column1 := 57
Row2 := 79
Column2 := 94
* 创建两个矩形ROI区域
gen_rectangle1 (ROIPart1, Row1, Column1, Row2, Column2)
gen_rectangle1 (ROIPart2, Row1 + 364, Column1 + 13, Row2 + 364, Column2 + 13)
* 将两个region合并为一个region
union2 (ROIPart1, ROIPart2, ModelROI)
area_center (ModelROI, Area, CenterROIRow, CenterROIColumn)
dev_display (ModelImage)
dev_display (ModelROI)
stop ()
*
* Create the model.
* 创建模型
* 将图像减少到ROI区域
reduce_domain (ModelImage, ModelROI, ImageROI)
create_generic_shape_model (ModelID)
* 设置模型参数金字塔层数为4,优化方法为none,对比度阈值为30
set_generic_shape_model_param (ModelID, 'num_levels', 4)
set_generic_shape_model_param (ModelID, 'optimization', 'none')
set_generic_shape_model_param (ModelID, 'contrast_high', 30)
* 基于提供的ImageROI,训练出一个能够识别具有相似形状特征的对象的模型
train_generic_shape_model (ImageROI, ModelID)
* 要从模型中获取轮廓信息存储在ModelContours中
get_generic_s