Halcon-可变行的模板匹配Deformable-shape-base

本文详细介绍了在Halcon中使用可变形模板匹配方法进行尺寸测量项目的定位过程。包括提取模型区域XLD轮廓,创建可变形模板,以及查找模板进行匹配的具体步骤。并解析了相关算子的参数设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**

可变化的模板匹配步骤

**
在基于Halcon开发的尺寸测量项目中经常会用到形状模板匹配方法进行定位,经常用到create_shape_model、create_shape_model_xld以及create_scale_shape_model等算子,但是标准的模板匹配定位方法无法适应目标可能存在大小和形状变化的情况。
可喜可贺的是,Halcon推出了可变形的模板匹配方法(deformable-shape-base),create_local_deformable_model及create_local_deformable_model_xld,本人习惯使用XLD。

模板匹配的基本步骤
1、提取感兴趣模型区域的XLD;
1.1、通过画矩形draw_rectangle1或者画多边形draw_polygon方法在图像上截取模型区域;
1.2、通过二值化方法提取所需要的模型区域;
1.3、通过gen_contour_region_xld方法获取模型区域的XLD轮廓。

2、利用前面提取的轮廓和create_local_deformable_model_xld方法创建XLD模板
算子相关参数
Contour: 需要所需创建模板的XLD,上述提取到了;
NumLevels: 创建模板的金字塔层数,根据实际情况进行设置,一般’auto’就可以
AngleStart: Halcon明确表示此参数不用(也不知道为什么不用的参数要写在里面
AngleExtent: Halcon明确表示此参数不用
AngleStep: 此算子的设置为‘auto’(我觉得即使给参数也没什么用,因为前面的都没用
ScaleRMin: 模板在Row方向上的可变形大小下限
ScaleRMax: Halcon明确表示此参数不用
ScaleRStep: 模板在Row方向上搜索步长
ScaleCMin: 模板在Column方向上的可变形大小下限
ScaleCMax: Halcon明确表示此参数不用
ScaleCStep: 模板在Column方向上搜索步长
Optimization: 次算子用来缓解内存的压力,可通过参数设置模型包含多少点,一般设置‘auto’
Metric: 主要包括是否忽略极性,极性就是黑白,如果使用极性,那么如果模型为黑背景为白,那么在匹配的时候,只能在白背景下匹配出黑模板;忽略极性就不用有这个影响了,因此通过轮廓匹配时是需要忽略极性的。
MinContrast: 创建模板的最小对比度,此参数的大小对模板的寻找准确性有影响,需根据调试设置。
GenParamName: 可选参数,我也不知道怎么用,一般为空
GenParamValue: 可选值,一般为空
ModelID: 当前创建模板的ID。

在创建好模板之后可以通过write_deformable_model保存模型,通过read_deformable_model加载模型。

3、查找模板进行匹配find_local_deformable_model
主要算子相关参数
ImageRectified: 匹配到的变形后模板图像;
VectorField: 变形矢量区,里面存储了匹配区域每个点变形后的位置,之所以叫vector是因为每个点为存储了行列坐标(x,y),动态图中的网格就是以此算出的;返回的区域大小是创建模板时domain的最小外界矩形大小,当然你可以通过ParamName参数中的expand_border扩展区域等到更大的区域。
DeformedContours: 匹配到的轮廓,非模板轮廓而是经过变形得出的轮廓
ResultType: ‘deformed_contours’, ‘image_rectified’, 'vector_field’可指定需要得出的结果分别对应
GenParamName: deformation_smoothness:平滑的度,对于变形越大参数越;expand_border:扩展ImageRecfified VectorField 区域
NumLevels: 对于Contour匹配外形不太精确时,适当增加金子塔层数,亲测效果较好。

以上三步,模板匹配基本就结束了,在后面Halcon还提供了通过观察网格变形情况的函数,在第三步后面使用即可,输入的图像变量为变形区矢量VectorField,代码如下:

gen_warped_mesh(VectorField : WarpedMesh : Step : )
gen_warped_mesh (VectorField, WarpedMesh, 10)

gen_empty_obj (WarpedMesh)
count_obj (VectorField, Number)
for Index := 1 to Number by 1
    * For visualization, we use the returned vector field
    * and generate a grid of the deformation in the search image.
    select_obj (VectorField, ObjectSelected, Index)
    vector_field_to_real (ObjectSelected, DRow, DColumn)
    get_image_size (VectorField, Width, Height)
    for ContR := 0.5 to Height[0] - 1 by Step
        Column1 := [0.5:Width[0] - 1]
        tuple_gen_const (Width[0] - 1, ContR, Row1)
        get_grayval_interpolated (DRow, Row1, Column1, 'bilinear', GrayRow)
        get_grayval_interpolated (DColumn, Row1, Column1, 'bilinear', GrayColumn)
        gen_contour_polygon_xld (Contour, GrayRow, GrayColumn)
        concat_obj (WarpedMesh, Contour, WarpedMesh)
    endfor
    for ContC := 0.5 to Width[0] - 1 by Step
        Row1 := [0.5:Height[0] - 1]
        tuple_gen_const (Height[0] - 1, ContC, Column1)
        get_grayval_interpolated (DRow, Row1, Column1, 'bilinear', GrayRow)
        get_grayval_interpolated (DColumn, Row1, Column1, 'bilinear', GrayColumn)
        gen_contour_polygon_xld (Contour, GrayRow, GrayColumn)
        concat_obj (WarpedMesh, Contour, WarpedMesh)
    endfor
endfor
return ()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值