halcon模板匹配 ——多个不同对象同时匹配

场景

在这里插入图片描述
需求是在一个视野里同时搜索匹配两个不同类型的对象。

效果

在这里插入图片描述

实现步骤

1.读取图像

read_image (ModelImage, 'rings_and_nuts')

2.分别生成两个ROI

gen_circle (ModelROIRing, 121, 299, 55)
gen_circle (ModelROINut, 324, 279, 52)
reduce_domain (ModelImage, ModelROIRing, ImageROIRing)
reduce_domain (ModelImage, ModelROINut, ImageROINut)

3.分别创建各向同性比例缩放形状模板

create_scaled_shape_model (ImageROIRing, 'auto', -rad(22.5), rad(45), 'auto', 0.8, 1.2, 'auto', 'none', 'use_polarity', 60, 10, ModelIDRing)
create_scaled_shape_model (ImageROINut, 'auto', -rad(30), rad(60), 'auto', 0.6, 1.4, 'auto', 'none', 'use_polarity', 60, 10, ModelIDNut)

4.分别获取形状模型的轮廓表示

inspect_shape_model (ImageROIRing, PyramidImage, ModelRegionRing, 1, 30)
get_shape_model_contours (ShapeModelRing, ModelIDRing, 1)`
inspect_shape_model (ImageROINut, PyramidImage, ModelRegionNut, 1, 30)
get_shape_model_contours (ShapeModelNut, ModelIDNut, 1)

5.连接两个模板轮廓XLD

concat_obj (ShapeModelRing, ShapeModelNut, ShapeModels)

6.保存模板相关信息

保存两个模板轮廓的个数到数组
count_obj (ShapeModelRing, NumContoursRing)
count_obj (ShapeModelNut, NumContoursNut)
NumContoursInTuple := [NumContoursRing,NumContoursNut]

保存两个模板的句柄到数组
ModelIDs := [ModelIDRing,ModelIDNut]

保存两个模板轮廓的起始索引到数组
StartContoursInTuple := [1,NumContoursRing + 1]

以上工作完成,便可以开始在新的图像上搜索匹配

7.读取新的图像

read_image (ModelImage, 'rings_and_nuts')

8.搜索匹配

find_scaled_shape_models (SearchImage, ModelIDs, [-rad(22.5),-rad(30)], [rad(45),rad(60)], [0.8,0.6], [1.2,1.4], 0.7, 0, 0, 'least_squares', 0, 0.8, RowCheck, ColumnCheck, AngleCheck, ScaleCheck, Score, ModelIndex)

8.对搜索到的XLD轮廓应用任仿射二维变换

for i := 0 to |Score| - 1 by 1
	*获取搜索到的模型索引
    Model := ModelIndex[i]
    *生成仿射变换矩阵
    vector_angle_to_rigid (0, 0, 0, RowCheck[i], ColumnCheck[i], AngleCheck[i], MovementOfObject)
    hom_mat2d_scale (MovementOfObject, ScaleCheck[i], ScaleCheck[i], RowCheck[i], ColumnCheck[i], MoveAndScalingOfObject)
   *根据搜索到的模型索引获取模板金字塔中的XLD轮廓
    copy_obj (ShapeModels, ShapeModel, StartContoursInTuple[Model], NumContoursInTuple[Model])
   *XLD轮廓应用仿射变换
    affine_trans_contour_xld (ShapeModel, ModelAtNewPosition, MoveAndScalingOfObject)
endfor

9.清除句柄

clear_shape_model (ModelIDRing)
clear_shape_model (ModelIDNut)

猜你喜欢

转载自blog.csdn.net/weixin_44901043/article/details/123574803