下面展示 源代码
。
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')
以上代码,如对你有所帮助,请多多点赞。
转载请注明出处!