halcon学习 基于形状的模板匹配find_shape_model

find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score)

  1.  [Image] 输入的图像
  2.  [ModelID]create_shape_model 创建的 匹配模板
  3.  [AngleStart] 模板旋转的起始角度
  4.  [AngleExtent] 模板旋转的范围,既最终旋转的范围是[AngleStart, AngleStart + AngleExtent],不能超过create_shape_model时的角度范围
  5.  [MinScore] 控制匹配出的模板相似度,越大越严格
  6.  [NumMatches] 最大匹配出的数量,0 无限制
  7.  [MaxOverlap] 控制允许的重叠量, 0 不允许重叠,
  8.  [SubPixel] 亚像素提取的控制字
  9.  [NumLevels] 金字塔层数,不能超过create_shape_model时的金字塔层数,0使用和create_shape_model一样的金字塔层数
  10.  [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 ()

模板匹配参数优化

  1. 如果希望重叠也能识别,尝试增加MaxOverlap
  2. 匹配变形,尝试增加max_deformation
  3. 如果匹配不到,尝试减少NumLevels,Greediness。
  4. 如果匹配异常,尝试增加MinScore,减少max_deformation
  5. 加快匹配速度,尝试增加NumLevels,MinScore,Greediness,减少max_deformation

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值