打开halcon,按下ctrl+e打开halcon自带例程。方法->模板匹配(基于形状)->matching_coins.hdev
下面的例程经过改动,官方例程是用本地函数,我这里为方便说明把本地函数全部写在主函数中
* distinguishing of coins with the help of shape-based matching
*
dev_close_window ()
dev_open_window (0, 0, 652, 494, 'black', WindowHandle)
dev_update_window ('off')
*定义硬币归属地数组变量
Names := ['german','italian','greek','spanish']
*定义一个空数组,用来存放模板ID,总共4种硬币,有4个模板
Models := []
for i := 0 to 3 by 1
read_image (Image, 'coins/20cent_' + Names[i])
dev_display (Image)
*train_model (Image, ModelID)
*阈值化处理
threshold (Image, Region, 70, 255)
*分割图像
connection (Region, ConnectedRegions)
*选择最大面积区域
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 0)
*形成凸包,把区域转变成圆形区域
shape_trans (SelectedRegions, RegionTrans, 'convex')
*获取区域中心座标
area_center (RegionTrans, Area, Row, Column)
*在区域中心位置处生成一个半径120的圆形区域作为创建模板的ROI
gen_circle (Coin, Row, Column, 120)
*创建模板的图像阈值定义
Contrast := 20
HysteresisContrast := [Contrast / 2,Contrast + 6,10]
reduce_domain (Image, Coin, ImageReduced)
*Called during the test phase to see if Contrast is selected correctly
*inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 1, HysteresisContrast)
*创建模板
create_shape_model (ImageReduced, 'auto', 0, rad(360), 'auto', 'none', 'ignore_local_polarity', HysteresisContrast, 5, ModelID)
*把模板ID添加到Models这个数组中
Models := [Models,ModelID]
endfor
for i := 1 to 13 by 1
read_image (Image, 'coins/20cent_' + i$'.2' + '.png')
*find_coin (Image, Models, Row, Column, Angle, Score, ModelIdx)
*locate_coin (Image, Coin)
threshold (Image, Region, 70, 255)
connection (Region, ConnectedRegions)
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 0)
shape_trans (SelectedRegions, RegionTrans, 'convex')
area_center (RegionTrans, Area, Row, Column)
gen_circle (Coin, Row, Column, 120)
area_center (Coin, Area, Row, Column)
gen_circle (Circle, Row, Column, 35)
reduce_domain (Image, Circle, ImageReduced)
*
*这个函数注意与find_shape_model函数区分。这个是寻找有多个模板的函数,第二个参数是模板ID数组
*而find_shape_model是只有一个模板,这两个函数查找的对象数目由第六个参数定义
*这个函数最后一个输出参数是与目标匹配的模板ID序号,从0开始
find_shape_models (ImageReduced, Models, 0, rad(360), 0.6, 1, 0, 'least_squares', 0, 0.9, Row, Column, Angle, Score, Model)
*获取模板轮廓,第二个参数是模板ID
get_shape_model_contours (ModelContours, Models[Model], 1)
*旋转平移变换把模板位置变换到相应查找到的目标上
vector_angle_to_rigid (0, 0, 0, Row, Column, Angle, HomMat2D)
affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2D)
*显示图像,显示轮廓
dev_display (Image)
dev_set_color ('green')
dev_set_line_width (2)
dev_display (ContoursAffineTrans)
set_tposition (WindowHandle, 24, 12)
*写出对应查找到的目标的国籍信息
write_string (WindowHandle, Names[Model])
*display_model (Image, Models[ModelIdx], Row, Column, Angle, Names[ModelIdx], WindowHandle)
stop ()
endfor
创建模板图像
查找到的图像分类结果