Bootstrap

HALCON开发教程:模板匹配参数详解(下篇)

欢迎来到广州研为官方频道!我们将在频道中不断更新运动控制案例讲解、小型项目代码讲解、运动控制知识科普、机器视觉知识科普等内容,只为与您一起交流分享运动控制的那些事。


        本文中将通过最直观的方式向你讲解,在模板匹配(形状匹配 shape_model_xld)中每一个参数对结果带来的影响以及我们应该如何尽可能快速地找到合适地参数用于模板匹配。

        本文结构将从实际操作的步骤进行组合

模板创建=>寻找模板=>显示结果

        文章上篇模板创建部分在这:Halcon开发教程:模板匹配参数详解(上篇)

        末尾是Halcon全代码结果演示有需要的同学可以根据目录或链接进行跳转。接下来开始进入正文。

目录

1.寻找模板

2.显示结果

3.模板匹配全过程演示

 使用编程平台进行快速开发,开发示例目标计数/抓取沿目标轮廓运动


@广州研为发布

1.寻找模板

       寻找模板find_shape_models是在拥有了模板ID(ModelID)后根据参数设置对图像进行目标搜索的方法。此处讲述的是使用find_shape_models进行单目标匹配,这是与find_shape_model的使用方法差别较小,两个方法之间的差别我们将在另一篇文章中介绍:正在施工中~,可前往个人主页查看文章

       find_shape_models(Image, ModelIDs, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness, Row, Column, Angle, Score, Model)

       与创建模板不同的是这里所有的参数都需手动输入,接下来是参数的讲解:

Image:准备进行目标搜索的图像

ModelIDs:模板的ID,用于在图像中搜索具有相同轮廓特征的目标。在图像中这里可以使用多个ID搜索多个目标,多模板匹配的文章在这贴出,本文就不多讲啦:正在施工中~,可前往个人主页查看文章

AngleStart, AngleExtent:参数与create_shape_model_xld中的定义相近,但如果我们需要对识别的目标旋转角度进行筛选,那么可以在此处进行设置,关于角度设置效果如图所示。

62ff4f7d90334cadb19cec1ee9546d9e.png

        需要注意的是:create_shape_model_xld对角度的设置是目标能否被找到的关键,find_shape_models对角度的设置是在此角度范围的基础上限制了输出结果的角度范围,因此两者之间是包含与被包含的关系。

MinScore:图像中目标的最低匹配分数。图像中所有潜在的目标结果都有一个准确度得分,只有当得分高于设定值时目标才会被视为结果被输出

7aba10262bdd44cf80eb62eaaae05310.png

NumMatches:返回结果的数量。当值设定为0时返回所有符合条件的结果,当值设定为为零时返回指定值的结果数量,如果结果数量小于设置值则返回所有结果

ad72d7241f63410eaf5a83885b031f32.png

MaxOverLap:最大重叠,重叠目标筛选。当两个潜在结果重叠的比例超过设定值,则返回匹配分数最高的一个;若两个潜在结果重叠的比例低于设定值则都返回结果。当值设为1时返回所有重叠结果,0则不返回重叠结果

2c529fb2ff224588aba894e97a77a6af.png

SubPixel:是否以亚像素精度提取结果,这里我们使用默认参数”least_squares”即可。

        如果图像目标出现了模板中没有的倾斜角度或其他与模板轮廓不相符的形变情况(即形状上发生了轻微变形),那么可以在least_squares后加入参数max_deformation n(n为非零整数,一般取1-6),使得图像目标能够以n个像素强度进行形变来匹配模板轮廓。

9b8d299050c24174b82e536b00e97e99.png

NumLevel:匹配时图像金字塔等级,这里使用默认的参数0即可,原理可以稍后熟悉操作后再了解。

Greediness:在使用形状匹配时,这个值用0.9即可

Row, Column, Angle, Score:返回目标轮廓中心的横纵坐标,倾斜角度以及匹配分数。在find_shape_models中并不会直接返回对应的轮廓结果,需要自行根据坐标点以及倾斜角度偏移轮廓进行显示

Model:返回结果所对应的模板ID索引。同一模板识别的目标索引值都是一致的。


2.显示结果

        和上一章说的一样,在图像中寻找到结果后并没有一个方法能够直接显示匹配结果,需要我们手动将模板轮廓根据目标位置进行偏移并显示,显示匹配结果的代码如下:

*创建形状模板

create_shape_model_xld (Edges, 'auto', 0, 3.14, 'auto', 'auto', 'ignore_local_polarity', 5, ModelID)

*寻找目标结果

find_shape_models (Image, ModelID, 0, 3.14, 0.7, 0, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score, Model)

*获取模板轮廓

get_shape_model_contours (ModelContours, ModelID, 1)

*刚性仿射变换,根据轮廓位置创建齐次变换矩阵

vector_angle_to_rigid (0, 0, 0, Row, Column, Angle, HomMat2D)

*根据矩阵将轮廓偏移至目标位置

affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2D)

        通过模板ID能够获取模板轮廓,模板轮廓中心的位置默认在坐标(0,0)处,倾斜角度也默认为0,因此我们进需要修改vector_angle_to_rigid后半部分的位置参数即可。


3.模板匹配全过程演示

*读入图像,打开窗口,显示窗口
dev_close_window ()
read_image (Image, 'printer_chip/printer_chip_01')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle)
dev_display (Image)

*使用工具:打开灰度直方图
threshold (Image, Regions, 60, 255)
*打散区域,为了提取单个目标区域
connection (Regions, ConnectedRegions)
*使用工具:打开特征直方图,显示筛选区域
select_shape (ConnectedRegions, SelectedRegions, ['area','row'], 'and', [23938.5,554.9], [73718.9,631.04])

*清空窗口显示筛选后图像
*dev_clear_window ()
*dev_display (SelectedRegions)

*填满区域
fill_up (SelectedRegions, RegionFillUp)
*裁剪区域
reduce_domain (Image, RegionFillUp, ImageReduced)
*获取图像边缘
edges_sub_pix (ImageReduced, Edges, 'canny', 0.9, 20, 40)

*创建形状模板
angleExtent:=360
***角度转弧度
tuple_rad (angleExtent, angleExtent_rad)
create_shape_model_xld (Edges, 'auto', 0, angleExtent_rad, 'auto', 'auto', 'ignore_local_polarity', 5, ModelID)
*寻找目标结果
find_shape_models (Image, ModelID, 0, 3.14, 0.7, 0, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score, Model)
*获取模板轮廓
get_shape_model_contours (ModelContours, ModelID, 1)
*刚性仿射变换,根据轮廓位置创建齐次变换矩阵
vector_angle_to_rigid (0, 0, 0, Row, Column, Angle, HomMat2D)
*根据矩阵将轮廓偏移至目标位置
affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2D)
*显示匹配结果
dev_display (ContoursAffineTrans)
stop()

*读取文件夹内所有图片
*此处路径为是Halcon示例图片路径,此处可根据自身情况修改路径
list_files ('C:/Users/Public/Documents/MVTec/HALCON-17.12-Progress/examples/images/printer_chip', 'files', Files)
*连续匹配
for Index := 0 to |Files|-1 by 1
    *读取图像,显示
    read_image (Image1, Files[Index])
    dev_display (Image1)
    *寻找目标结果
    find_shape_models (Image1, ModelID, 0, angleExtent_rad, 0.6, 0, 0, 'least_squares', 0, 0.9, Row1, Column1, Angle1, Score1, Model)
    *如果结果为空
    if(|Row1| == 0)
        continue
    endif
    *获取模板轮廓
    get_shape_model_contours (ModelContours, ModelID, 1)
    *刚性仿射变换,根据轮廓位置创建齐次变换矩阵
    vector_angle_to_rigid (0, 0, 0, Row1, Column1, Angle1, HomMat2D)
    *根据矩阵将轮廓偏移至目标位置
    affine_trans_contour_xld (ModelContours, ContoursAffineTrans1, HomMat2D)
    *显示匹配结果
    dev_display (ContoursAffineTrans1)
    stop()
endfor

         代码的演示效果如图所示。

1f0e063a6a1147bdbceaedb56bc903fa.png


总结:

        本文中通过最直观的方式向你讲解,在模板匹配(形状匹配, shape_model_xld)中每一个参数对结果带来的影响以及我们应该如何尽可能快速地找到合适地参数用于模板匹配。
        本文结构将从实际操作的步骤进行组合:模板创建=>寻找模板=>显示结果。末尾是Halcon全代码结果演示。

        至此文章就以接近尾声,十分感谢大家观看,如果大家觉得文章有帮助不妨点赞收藏,你们的关注既是对我们最大的鼓励!

       如果需要对机器视觉应用进行快速开发的同学,可以试着使用我们的编程平台通过选择模块“搜索目标工件”,“定位目标工件”并对代码一键生成,同样也可以试着使用编程平台的模板生成软件体验快速生成模板ID

;