Halcon例程分析4:基于形状的模板匹配

打开halcon,按下ctrl+e打开halcon自带例程。方法->模板匹配(基于形状)->find_scaled_shape_model.hdev

此方法通过形状的轮廓来查找,主要用于需要寻找的物体轮廓清晰,黑白特征明显,轮廓架构相对简单的情形。

* This example program shows how to find scaled and rotated shape models.
dev_update_pc ('off')
dev_update_window ('off')
dev_update_var ('off')
*读取图片
read_image (Image, 'green-dot')
*获取图片尺寸
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_set_color ('red')
*显示图片
dev_display (Image)
*阈值化,选择黑色的区域
threshold (Image, Region, 0, 128)
*对阈值化出来的黑色区域做分割处理
connection (Region, ConnectedRegions)
*根据面积这个特征选择,在图形窗口上显示ConnectedRegions这个图像,
*右键-》工具-》特征检测,选中需要的区域查看其面积值,这个例程中是14805
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10000, 20000)
*填充区域
fill_up (SelectedRegions, RegionFillUp)
*用圆形卷积核对图像做腐蚀操作,稍微扩大感兴趣区域的面积,最后一个参数是卷积核半径
dilation_circle (RegionFillUp, RegionDilation, 5.5)
*在原图像上只选中我们感兴趣的区域
reduce_domain (Image, RegionDilation, ImageReduced)
*上面的操作只是为了把需要寻找的区域范围圈出来,我们完全可以直接手动绘制出来的
*下面是创建模板
*第一个参数(ImageReduced)是输入图像,即需要寻找轮廓的那个图像,
*第二个参数(5)是金字塔层数
*第三个参数(rad(-45))是起始角度值,这个指的是需要寻找的那个模型的可能角度值
*第四个参数(rad(90))是角度大小,在这个例子中是-45到45°总共90°范围内寻找模板,超过这个范围的不会被找到
*第五个参数('auto')是角度步长
*第六个参数(0.8)是最小缩放因子
*第七个参数(1。0)是最大缩放因子
*第十个参数(40)是对比度阈值,即在这幅图像中所需要找的轮廓与背景的像素差值,这里可以是一个数组,如果输入的是一个数组,第一个数值是最小阈值,第二个数值是最大阈值,最终寻找在这个阈值范围内的轮廓
*最后一个输出参数模型ID
create_scaled_shape_model (ImageReduced, 5, rad(-45), rad(90), 'auto', 0.8, 1.0, 'auto', 'none', 'ignore_global_polarity', 80, 10, ModelID)
*通过ID获取到模型的轮廓,这个轮廓的中心位置在图像的原点位置处
get_shape_model_contours (Model, ModelID, 1)
*下面的仿射变换是为了显示用的
*求出最初感兴趣区域的中心位置坐标
area_center (RegionFillUp, Area, RowRef, ColumnRef)
*求出原图形轮廓相对原点的仿射变换矩阵
vector_angle_to_rigid (0, 0, 0, RowRef, ColumnRef, 0, HomMat2D)
*把查找出来的轮廓变换到原图像的模型位置处
affine_trans_contour_xld (Model, ModelTrans, HomMat2D)
*显示
dev_display (Image)
dev_display (ModelTrans)

*读取图像
read_image (ImageSearch, 'green-dots')
dev_display (ImageSearch)
*对图像查找模板
*第一个参数(ImageSearch)需要查找模板的输入图像
*第二个参数(ModelID)已经创建的模板的ID,
*第三个参数(rad(-45))是起始角度值,这个指的是需要寻找的那个模型的可能角度值
*第四个参数(rad(90))是角度大小,在这个例子中是-45到45°总共90°范围内寻找模板,超过这个范围的不会被找到
*第五个参数(0.8)是最小缩放因子
*第六个参数(1.0)是最大缩放因子
*第七个参数(0.5)是最小分数,查找到的模板都会有一个分数值,这个值越大说明越像模板,越小越不像,低于这个分数就认为不是同一个东西了
*第八个参数(0)查找的模板个数,为0时说明把所有出现的全部查找出来
*第九个参数(0.5)是允许两个模板间最大重叠的部分是多少,如果设置为0说明不允许两个模型重叠,可以在这个例子中试一下
*第十个参数('least_squares')是亚像素精度参数,这里用最小二乘求更高精度的像素
*第十一个参数(5)金字塔层数
*第十一个参数(0.8)是贪婪度
*后面的参数是查找到的模型的输出值,如果找不到则其值为空,找到多个则其值为一个数组,每个数据对应一个相应的模型
find_scaled_shape_model (ImageSearch, ModelID, rad(-45), rad(90), 0.8, 1.0, 0.5, 0, 0.5, 'least_squares', 5, 0.8, Row, Column, Angle, Scale, Score)

*下面是为了显示出查找到的模型,做仿射变换把轮廓变换到相应图像上的位置,应为轮廓始终是在原点上的,但查找到的参数只有其中心点坐标,角度,缩放因子等参数
*通过仿射变换把原轮廓变换到相对应的位置上
for I := 0 to |Score| - 1 by 1
    hom_mat2d_identity (HomMat2DIdentity)
    hom_mat2d_translate (HomMat2DIdentity, Row[I], Column[I], HomMat2DTranslate)
    hom_mat2d_rotate (HomMat2DTranslate, Angle[I], Row[I], Column[I], HomMat2DRotate)
    hom_mat2d_scale (HomMat2DRotate, Scale[I], Scale[I], Row[I], Column[I], HomMat2DScale)
    affine_trans_contour_xld (Model, ModelTrans, HomMat2DScale)
    dev_display (ModelTrans)
endfor

模板图像与模板轮廓

查找的图像与查找到的轮廓

上面是官方例程,下面是一个手机摄像头模组装配对位的项目,原理与上面官方例程完全一致

* This example program shows how to find scaled and rotated shape models.
dev_update_pc('off')
dev_update_window('off')
dev_update_var('off')
read_image(Image, 'C:/Users/Administrator/Desktop/1.bmp')
get_image_size(Image, Width, Height)
dev_close_window()
dev_open_window(0, 0, 512, 512, 'black', WindowHandle)
dev_set_color('red')
dev_display(Image)
threshold(Image, Region, 0, 30)
connection(Region, ConnectedRegions)
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 96000, 96105)
fill_up(SelectedRegions, RegionFillUp)
dilation_circle(RegionFillUp, RegionDilation, 5.5)
*gen_rectangle1(ROI_0, 265, 194, 490, 911)
reduce_domain(Image, RegionDilation, ImageReduced)
create_scaled_shape_model(ImageReduced, 5, rad(-45), rad(90), 'auto', 0.8, 1.0, 'auto', 'none', 'ignore_global_polarity', 40, 10, ModelID)
get_shape_model_contours(Model, ModelID, 1)
area_center(RegionFillUp, Area, RowRef, ColumnRef)
vector_angle_to_rigid(0, 0, 0, RowRef, ColumnRef, 0, HomMat2D)
affine_trans_contour_xld(Model, ModelTrans, HomMat2D)
dev_display(Image)
dev_display(ModelTrans)
read_image(ImageSearch, 'C:/Users/Administrator/Desktop/5.bmp')
dev_display(ImageSearch)
find_scaled_shape_model(ImageSearch, ModelID, rad(-45), rad(90), 0.8, 1.0, 0.5, 0, 0.5, 'least_squares', 5, 0.8, Row, Column, Angle, Scale, Score)
for I : = 0 to | Score | -1 by 1
hom_mat2d_identity(HomMat2DIdentity)
hom_mat2d_translate(HomMat2DIdentity, Row[I], Column[I], HomMat2DTranslate)
hom_mat2d_rotate(HomMat2DTranslate, Angle[I], Row[I], Column[I], HomMat2DRotate)
hom_mat2d_scale(HomMat2DRotate, Scale[I], Scale[I], Row[I], Column[I], HomMat2DScale)
affine_trans_contour_xld(Model, ModelTrans, HomMat2DScale)
dev_display(ModelTrans)
endfor

手机摄像头模组原始测试图

查找效果图

  • 9
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

究极调参工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值