2D算法 Halcon 检测工件孔洞毛刺缺陷

在日常工程应用中,我们通常通过halcon的形状匹配(shape-based matching)进行各种定位,正如上篇例程,当待匹配物体有轻微变形时,并不影响得到的匹配结果,然后当待匹配物体有较大变形时,如塑料产品在成形时变形、纺织产品的花纹因为褶皱变形等,要想得到精确的定位结果就显得捉襟见肘,如下图所示,工件如果有较大变形,在用形状匹配时,定位结果就不尽如人意,因为形状匹配本身得到的匹配结果只是一个点(row,col)。

因此本篇例程使用了局部变形匹配(local deformable matching),匹配结果可以根据待匹配物体自动进行变形。而且在这个案例中,create_variation_model (Width, Height, ‘byte’, ‘direct’, VariationModelID) 使用的方法是’direct’,因此是不需要训练差异模型而可以直接使用的。

1️⃣读入标准图像,创建差异模型以及匹配模板

*1.读入图像
dev_update_off ()
dev_get_window (WindowHandle)
set_display_font (WindowHandle, 36, ‘mono’, ‘true’, ‘false’)
dev_set_draw (‘margin’)

read_image (ModelImage, ‘gasket/gasket_model’)
get_image_size (ModelImage, Width, Height)
read_image (Image, ‘gasket/gasket_01’)
*2.创建差异模型
create_variation_model (Width, Height, ‘byte’, ‘direct’, VariationModelID)
sobel_amp (ModelImage, EdgeAmplitude, ‘sum_abs’, 3)
*3.直接设参数+标准图像+边缘幅度图像
prepare_direct_variation_model (ModelImage, EdgeAmplitude, VariationModelID, 20, 2)
*4.创建局部变形匹配模板
create_local_deformable_model (ModelImage, ‘auto’, [], [], ‘auto’, 0.9, [], ‘auto’, 0.9, [], ‘auto’, ‘none’, ‘use_polarity’, ‘auto’, ‘auto’, [], [], ModelID)
get_deformable_model_contours (ModelContours, ModelID, 1)
area_center (ModelImage, Area, Row, Column)
标准图像:

在这里插入图片描述

这里由于是用单幅图像创建的差异模型,因此参数Mode设置的’direct’,故不需要再去训练,而是直接使用prepare_direct_variation_model (ModelImage, EdgeAmplitude, VariationModelID, 20, 2)得到差异模型。

2️⃣通过匹配模板将待检测工件定位矫正

for Index := 1 to 7 by 1
read_image (Image, ‘gasket/gasket_’ + Index$‘02’)
get_image_size (Image, Width1, Height1)
*5.查找
find_local_deformable_model (Image, ImageRectified, VectorField, DeformedContours, ModelID, rad(-10), rad(20), 1, 1, 1, 1, 0.93, 1, 0.7, 0, 0.4, [‘image_rectified’,‘vector_field’,‘deformed_contours’], [‘deformation_smoothness’,‘expand_border’,‘subpixel’], [25,0,1], Score, Row, Column)
if (|Score| > 0)
gen_warped_mesh_region (VectorField, MeshRegion, 25)
gen_region_contour_xld (DeformedContours, EdgeRegion, ‘margin’)
dilation_circle (EdgeRegion, RegionDilation, 2 * 25)
intersection (RegionDilation, MeshRegion, RegionIntersection)
dev_set_line_width (1)
dev_set_color (‘yellow’)
dev_display (Image)
dev_display (RegionIntersection)
Found[Index] := |Score|
dev_set_line_width (2)
dev_set_color (‘green’)
dev_display (DeformedContours)
* 7.注意:这里显示的是修正过的图像
dev_display (ImageRectified)
endif
待检测图像:

在这里插入图片描述

局部变形匹配定位:

在这里插入图片描述

矫正:

在这里插入图片描述

由于局部变形模板匹配在寻找到图像(find_local_deformable_model)后是自动矫正的,因此我们可以省掉仿射变换的步骤了。

3️⃣通过差异模型差分得到缺陷工件

*6.差分
compare_variation_model (ImageRectified, Region, VariationModelID)
connection (Region, ConnectedRegions)
 *缺陷提取(特征选择,即面积大于60的定义为缺陷)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 60, 99999)
count_obj (SelectedRegions, Number)
*显示
if(Number>0)          
       disp_message (WindowHandle, 'NG', 'image', 12, 12, 'red', 'false')
else           
       disp_message (WindowHandle, 'OK', 'window', 12, 12, 'magenta', 'false')
endif   
dev_set_color ('red')
dev_display (SelectedRegions)
stop()

endfor
dev_update_on ()
在这里插入图片描述

相关算子分析:

create_local_deformable_model(创建局部变形匹配模板)
create_local_deformable_model(Template , NumLevels, AngleStart, AngleExtent, AngleStep, ScaleRMin, ScaleRMax, ScaleRStep, ScaleCMin,ScaleCMax, ScaleCStep, Optimization, Metric, Contrast, MinContrast, ParamName, ParamValue ,ModelID)

参数列表:
Template //输入多通道图像,用来创建model
NumLevels //金字塔层数:‘auto’, 0,1,2,3,。。。
AngleStart //输入起始角度(默认-0.39)
AngleExtent//角度旋转的范围(默认0.79)
AngleStep //旋转的步长,即分辨率,默认’auto’
ScaleRMin//行方向的最小缩放比例,默认1.0,通常大于0小于1
ScaleRMax//行方向的最大缩放比例,默认1.0,通常大于1小于1.5
ScaleRStep//行方向的缩放步长,可影响行方向的分辨率,默认’auto’, 0.01,0.02,0.05,。。
ScaleCMin//
ScaleCMax// 列方向,同上
ScaleCStep//
Optimization//生成模型时的优化方式,默认’none’可选,‘auto’,‘point_reduction_XXX’
Metric//比较时候的标准,默认’use_polarity’使用极坐标系进行比较
Contrast//在模板图片的滤波或者磁滞滤波中,控制结果的对比度,默认’auto’, 10, 20…
MinContrast//在搜寻对象过程中的最小对比度,默认’auto’, 1, 2, 3, 5…
ParamName// 普通参数名字(不太清楚用途,后续研究)默认[], ‘min_size’,‘part_size’
ParamValue//参数值, 默认[], 可选’small’, ‘medium’, big’
ModelID// 输出的模型handle
变形检测用来检测一个对象是否局部变形,这个检测模型在保持严格的基础上允许一些细小的变形,和find_shape_model(在图中找到相应图形的最佳匹配)不同,create_local_deformable_model更加智能化,它可以预估变形程度并且修正图像中物体的位置(物体相对于图像的相对位置),它可以处理更大的变形。

get_deformable_model_contours(得到局部变形模板的轮廓)
get_deformable_model_contours( ModelContours , ModelID, Level )
//Level决定了返回第几层金字塔图像的边缘
find_local_deformable_model (在待匹配图像中寻找变形模板)
find_local_deformable_model(Image ,ImageRectified, VectorField, DeformedContours : ModelID, AngleStart, AngleExtent, ScaleRMin, ScaleRMax, ScaleCMin, ScaleCMax, MinScore, NumMatches, MaxOverlap, NumLevels, Greediness, ResultType, ParamName, ParamValue : Score, Row, Column)

参数列表:
Image //输入待匹配图像
ImageRectified //输出匹配到的变形矫正后模板图像
VectorField//变形矢量区
DeformedContours //匹配到的轮廓,不是矫正后的轮廓
ModelID//模型句柄
AngleStart//起始角度
AngleExtent//角度范围
ScaleRMin//行缩放最小比例
ScaleRMax//行缩放最大比例
ScaleCMin//
ScaleCMax//列同上
MinScore//最小相似度
NumMatches//需要几个最佳匹配结果
MaxOverlap//最大重叠数
NumLevels//金字塔层数
Greediness//贪婪度(范围0-1,0表示精确缓慢,1表示迅速精度不高)
ResultType//输出的结果类型([], ‘deformed_contours’, ‘image_rectified’, ‘vector_field’)
ParamName//参数名称
Score//输出匹配度
Row, Column//输出行列坐标
这个函数的功能是在一张图片中找到变形模型中的最佳匹配结果(可以是多个,由NumMatches输入),模型必须在之前的步骤中使用(create_local_deformable_model或者read_deformable_model)生成。这个函数会返回找到的结果的行,列坐标(Row, Column)作为输出。

另外函数在找到匹配的模型后,输出矫正后的图像(ImageRectified),向量区域(VectorField)和匹配到的轮廓(DeformedContours) 通过参数ResultType去选择需要返回哪个(默认[],都不返回)。

ParamName可以调整参数的设置:(比如)
deformation_smoothness:平滑的度,对于变形越大参数越大
expand_border:扩大ImageRecfified VectorField 区域
gen_warped_mesh(生成变形网格,封装函数)
gen_warped_mesh (VectorField, WarpedMesh, 10)

VectorField// 输入向量区域
WarpedMesh//输出变形网格
10 //代表此函数隔10个像素取值

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值