find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score)
- [Image] 输入的图像
- [ModelID]create_shape_model 创建的 匹配模板
- [AngleStart] 模板旋转的起始角度
- [AngleExtent] 模板旋转的范围,既最终旋转的范围是[AngleStart, AngleStart + AngleExtent],不能超过create_shape_model时的角度范围
- [MinScore] 控制匹配出的模板相似度,越大越严格
- [NumMatches] 最大匹配出的数量,0 无限制
- [MaxOverlap] 控制允许的重叠量, 0 不允许重叠,
- [SubPixel] 亚像素提取的控制字
- [NumLevels] 金字塔层数,不能超过create_shape_model时的金字塔层数,0使用和create_shape_model一样的金字塔层数
- [Greediness] 贪婪度 0 尽最大可能匹配到目标 , 1 可能匹配不到目标,但速度最快
匹配圆
* 代码不具实用性,只用于演示
dev_get_window (WindowHandle)
dev_clear_window ()
dev_set_color ('red')
read_image (Image, 'circle_plate')
dev_display (Image)
dev_update_off ()
* 圆的半径
Radius:=63
* 生成圆
gen_circle (Circle, Radius+1, Radius+1, Radius)
* 转换成图像
region_to_bin (Circle, BinCircle, 255, 0,Radius*2+2, Radius*2+2)
* 创建模板
* 圆不需要旋转角度
create_shape_model (BinCircle, 3, -rad(0), rad(0), 'auto', 'none', 'use_polarity', 'auto', 'auto', ModelID)
inspect_shape_model (BinCircle, ModelImages, ModelRegions, 2, 160)
* 基于形状的模板匹配
find_shape_model (Image, ModelID, -rad(0), rad(0), 0.5, 10, 0.5, ['least_squares'], 0, 0.9, Row, Column, Angle, Score)
* 标识出找到的圆
if (|Score| > 0)
for j := 0 to |Score| - 1 by 1
vector_angle_to_rigid (0, 0, 0, Row[j], Column[j], Angle[j], MovementOfObject)
get_shape_model_contours (ShapeModel, ModelID, 1)
affine_trans_contour_xld (ShapeModel, ModelAtNewPosition, MovementOfObject)
gen_region_contour_xld (ModelAtNewPosition, RegionModelAtNewPosition, 'filled')
dev_display (ModelAtNewPosition)
endfor
endif
dev_update_on ()
匹配形状
* 代码不具实用性,只用于演示
dev_get_window (WindowHandle)
dev_clear_window ()
dev_set_color ('red')
read_image (Image, 'clip.png')
get_image_size (Image, Width, Height)
dev_display (Image)
dev_update_off ()
* 任意选择一个回形针图像用于制作模板
binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ['ra','rb'], 'and', [100, 30], [120,50])
select_obj (SelectedRegions, ObjectSelected, 1)
smallest_rectangle2 (ObjectSelected, Row1, Column1, Phi1, Length1, Length2)
*gen_rectangle2 (Rectangle, Row1, Column1, Phi1, Length1, Length2)
vector_angle_to_rigid (Row1, Column1, 0, Length2, Length1, -Phi1, MovementOfObject)
affine_trans_region (ObjectSelected, RegionAffineTrans, MovementOfObject, 'nearest_neighbor')
*affine_trans_image (Image, ImageAffineTrans, MovementOfObject, 'constant', 'false')
*reduce_domain (ImageAffineTrans, RegionAffineTrans, ImageReduced)
*crop_domain (ImageReduced, ImagePart)
region_to_bin (RegionAffineTrans, BinImageM, 255, 0, Length1*2+1, Length2*2+1)
region_to_bin (SelectedRegions, BinImage, 255, 0, Width, Height)
* 创建模板
create_shape_model (BinImageM, 5, -rad(180), rad(360), 0.001, 'none', 'use_polarity', 'auto', 'auto', ModelID)
inspect_shape_model (BinImageM, ModelImages, ModelRegions, 2, 160)
* 基于形状的模板匹配,由于回形针有变形,有正反,为了提升检出率,max_deformation取得较大,导致速度较慢
find_shape_model (Image, ModelID, -rad(180), rad(360), 0.5, 20, 0.1, ['least_squares','max_deformation 4'], 0, 0.9, Row, Column, Angle, Score)
* 标识出找到的回形针
if (|Score| > 0)
for j := 0 to |Score| - 1 by 1
vector_angle_to_rigid (0, 0, 0, Row[j], Column[j], Angle[j], MovementOfObject)
get_shape_model_contours (ShapeModel, ModelID, 1)
affine_trans_contour_xld (ShapeModel, ModelAtNewPosition, MovementOfObject)
dev_display (ModelAtNewPosition)
endfor
endif
dev_update_on ()
模板匹配参数优化
- 如果希望重叠也能识别,尝试增加MaxOverlap
- 匹配变形,尝试增加max_deformation
- 如果匹配不到,尝试减少NumLevels,Greediness。
- 如果匹配异常,尝试增加MinScore,减少max_deformation
- 加快匹配速度,尝试增加NumLevels,MinScore,Greediness,减少max_deformation