Bootstrap

halcon之基于形状的模板匹配方法实例

模板源
处理图像
匹配结果图像

下面展示 源代码

dev_update_off ()
dev_close_window ()

*******定位模板********
*读取图像
read_image (Image, 'E:/Halcon_Learn/基于形状的模板匹配/green-dot.png')
*获取图像的宽高
get_image_size (Image, Width, Height)
*以合适的尺寸打开图像
dev_open_window_fit_size (0, 0, Width, Height, -1, -1, WindowHandle)
*显示图像
dev_display (Image)
*设置显示字体
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
*设置画图填充方式
dev_set_draw ('margin')
*设置颜色
dev_set_color ('red')
*设置线宽
dev_set_line_width (3)
*定义数组
Message := '这个实例演示如何创建一个模板'
Message[1] := '形状匹配模板建立与保存'
Message[2] := '模板匹配的使用'
*显示数组话语
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
*继续提示语显示
disp_continue_message (WindowHandle, 'black', 'true')
*执行断点处
stop()

*阈值化
threshold (Image, Regions, 0, 122)
*连通区域分块
connection (Regions, ConnectedRegions)
*内部区域填充
fill_up (ConnectedRegions, RegionFillUp)
*区域特征筛选(面积特征)
select_shape (RegionFillUp, SelectedRegions, 'area', 'and', 14845, 57911.9)
*膨胀处理
dilation_circle (SelectedRegions, RegionDilation, 3.5)
*裁剪目标区域图像
reduce_domain (Image, RegionDilation, ImageReduced)

*******生成模板********
*监视模板
inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 1, 40)

*创建形状模板
*使用用图像创建带有缩放的匹配模板
*NumLevels 最高金子塔层数
*AngleStart 开始角度加rad(90)是将弧度制转为角度值
*AngleExtent 角度范围
*AngleStep 旋转角度步长
*ScaleMin 模板行方向缩放最小尺度
*ScaleMax 模板行方向缩放最大尺寸
*MinScore 最低匹配分值 百分比
*ScaleStep 步长
*Optimization 优化选项 是否减少模板点数
*Metric 匹配度量级性旋转 
*MinContrast 最小对比度
*ModelID 生成模板ID
 create_scaled_shape_model (ImageReduced, 5, rad(-45), rad(90), 0, 0.8, 1.0, 0, ['none','no_pregeneration'], 'ignore_global_polarity', 40, 10, ModelID)

 
*保存模板
 write_shape_model (ModelID, 'E:/Halcon_Learn/基于形状的模板匹配/ShapeModel_dot.shm')
 
 *清除模板
 clear_shape_model (ModelID)
 
 
 *******模板匹配********
 *获取检测目标图像
 read_image (Image1, 'E:/Halcon_Learn/基于形状的模板匹配/green-dots.png')
 
 *提示语定义与显示
 Message := '形状匹配步骤开始'
 disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
 
 *读取形状模板
 read_shape_model ('E:/Halcon_Learn/基于形状的模板匹配/ShapeModel_dot.shm', ModelID1)
 
 *模板匹配
 *寻找单个带尺度形状模板最佳匹配
*ImageRectifiedFixed 要搜索的图像
*ModelID 模板ID
*AngleStart 开始角度加rad(90)是将弧度制转为角度值
*AngleExtent 角度范围
*ScaleMin 模板行方向缩放最小尺度
*ScaleMax 模板行方向缩放最大尺寸
*MinScore 最低匹配分值 百分比
*NumMatches 匹配实例的个数; 0时,全部检测
*MaxOverlap 最大重叠 在有重叠时也可检测匹配
*SubPixel 是否亚像素精度
*NumLevels 金子塔层数
*Greediness 搜索贪婪度; 0安全慢;1块不稳定;其他就是介于中间值
*剩下的几个参数是匹配图像的位置状态等参数
find_scaled_shape_model (Image1, ModelID1, rad(-45), rad(90), 0.8, 1.0, 0.5, 0, 0.5, 'least_squares', 5, 0.8, Row, Column, Angle, Scale, Score)
 
*返回一个轮廓模型的轮廓表示
get_shape_model_contours (ModelContours, ModelID1, 1)

dev_display (Image1)
*循环
for i:=0 to |Score|-1 by 1
   *得到对应匹配目标的旋转矩阵
    vector_angle_to_rigid (0, 0, 0, Row[i], Column[i], Angle[i], HomMat2DRotate)
   *在旋转矩阵的基础上添加缩放量,生成新的矩阵
    hom_mat2d_scale (HomMat2DRotate, Scale[i], Scale[i], Row[i],Column[i], HomMat2DScale)
    *矩阵变换(xld基础上)
    affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2DScale)
    *xld转换成region
    gen_region_contour_xld (ContoursAffineTrans, Region, 'filled')
    *对区域,生成最小外接矩形
    smallest_rectangle1 (Region, Row1, Column1, Row2, Column2)
    *使用绿色矩形框,框选匹配结果
    dev_set_color ('green')
    disp_rectangle1 (WindowHandle, Row1[0], Column1[0], Row2[0], Column2[0])
    *使用红色勾画匹配结果轮廓
    dev_set_color ('red')
    dev_display (ContoursAffineTrans)
    *显示各匹配结果提示语
    disp_message (WindowHandle, '第'+(i+1)+'个', 'window', Row1[0]-30, (Column1[0]+Column2[0])/2-10, 'green', 'false')
endfor

 *提示语定义与显示
 Message := '形状匹配结果如下:'
 disp_message (WindowHandle, Message, 'window', 12, 12, 'green', 'false')

 dump_window_image (Image2, WindowHandle)
 write_image (Image2, 'png', 0, 'E:/Halcon_Learn/基于形状的模板匹配/dots_shm.png')

以上代码,如对你有所帮助,请多多点赞。
转载请注明出处!

;