Bootstrap

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

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


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

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

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

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


目录

1.模板创建

1.1选择目标ROI (感兴趣区域,Region of Interest)

1.1.1通过灰度值创建ROI

1.1.2 手动绘制ROI

1.1.3 通过坐标创建ROI

1.2获取模板边缘

1.3创建模板

后续内容在下篇,点击此处快速跳转:Halcon开发教程:模板匹配参数详解(下篇)

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


  文章所属:@广州研为

1.模板创建

        在Halcon中模板匹配的方法有很多,每一种方法都有自己优劣势,因此在进行模板创建前我们先要明确被检测物是否适合于当前方法

       关于模板匹配的种类,我们可以在使用手册上发现他的大致分类:

  1. 基于组件的
  2. 基于相关度的
  3. 目标可变形的
  4. 基于描述符的
  5. 基于形状的

        基于形状的模板匹配(即shape_model)不通过像素以及邻域的灰度值作为模板,而是通过轮廓的形状来描述模型。形状模板的定义已经介绍了他的优势以及劣势:

  1. 通过获取图像的轮廓描述图形
  2. 图像在除目标外的背景应尽可能干净
  3. 提供模板的样品应尽可能地保证目标轮廓是理想且干净的

        在了解了形状匹配的特性后,我们就可以判断这个方法是否符合我们的检测场景了,接下来要做的就是创建模板。

  文章所属:@广州研为

1.1选择目标ROI (感兴趣区域,Region of Interest)

        在计算图像的边缘时,我们应通过尽可能地减少非必要的轮廓以此缩短计算机的运算时间。在提供模板的样图中,我们可以通过裁剪的方式指定我们需要进行处理的区域,这个区域被称为ROI。

       在Halcon中创建ROI的方法有很多,此处我们讲用的比较多的三种方式:

  1. 通过灰度值创建区域
  2. 通过鼠标手动创建
  3. 通过坐标点创建

1.1.1通过灰度值创建ROI

        在视觉处理中,如果目标与颜色特征无关时我们应选择灰度图作为输入图像进行处理,以此提高计算速度以及准确度。

        在灰度图中,我们可以通过限定灰度值的范围来生成对应的ROI区域,简单且直观的看,我们可以通过Halcon的打开灰度直方图工具对ROI进行初步的筛选,通过打开特征直方图进一步筛选ROI。

d5ba6488e36d451bb016a1dde0c7cbb0.png

图1 工具的所在位置

52e228eb185f41be9c3c4c5950b52800.png

图2 使用工具:打开灰度直方图

34c73849a57c4c168e997fff1e1c96d7.png

图3 使用工具:打开特征直方图

96c3e0330a7a45a09bcc2e7e356b2067.png

图4 基于灰度值创建的ROI

        在使用工具进行筛选后,工具都会自动生成对应的代码到程序中,对应生成的代码如下:

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)

*根据ROI裁剪图像
reduce_domain (Image, RegionFillUp, ImageReduced)

1.1.2 手动绘制ROI

        我们在Halcon中可以尝试使用在图像窗口中手动绘制图形的方法后去ROI,能够绘制的形状也是比较多的,这里我们就挑两种用的最多的形状来距离:矩形与圆形

        使用方法draw_circle, draw_rectangle1, draw_rectangle2时,操作是比较简单的,点击鼠标左键并拖动即可创建/调整图形,点击鼠标右键确认当前形状,大家实际上手操作后会很快熟悉不用担心记不住操作方法。

        手动绘制ROI的代码如下:

*手动绘制圆形区域
draw_circle (WindowHandle, Row1, Column1, Radius)
*根据返回参数生成对应的圆形
gen_circle (Circle, Row1, Column1, Radius)

*手动绘制矩形区域,矩形1是一个不带有倾斜角度的矩形
draw_rectangle1 (WindowHandle, Row11, Column11, Row2, Column2)
*根据返回的参数生成对应的矩形
gen_rectangle1 (Rectangle, Row11, Column11, Row2, Column2)

*手动绘制矩形区域,矩形2是一个带有倾斜角度的矩形
draw_rectangle2 (WindowHandle, Row3, Column3, Phi, Length1, Length2)
*根据返回的参数生成对应的矩形
gen_rectangle2 (Rectangle1, Row3, Column3, Phi, Length1, Length2)

1.1.3 通过坐标创建ROI

        这种方式与手动绘制方式的区别并不大,最大的不同就在于形状的所有参数都由我们自己输入,而不是通过手绘的方式让方法帮你确认。所以在代码上与手动绘制ROI并没有太大区别。

*绘制圆形区域,圆心(15,15),半径5
gen_circle (Circle, 15, 15, 5)

*绘制矩形区域,矩形左上角顶点(20,20),右下角顶点(100,100)
gen_rectangle1 (Rectangle, 20, 20, 100, 100)

*绘制矩形区域,矩形中心(50,50),倾斜弧度2.5,宽度60,高度20
gen_rectangle2 (Rectangle1, 50, 50, 2.5, 60, 20)

  文章所属:@广州研为

1.2获取模板边缘

        在创建ROI后就可以对图像使用生成边缘了,获取图像边缘的Halcon方法是:edges_sub_pix,在方法中获取图像边缘的滤波有很多,这里主要讲解的是基于Canny滤波的处理方法,且针对Lthread, Hthread参数的介绍

        Lthread, Hthread的作用是划分图像中哪些区域应该是轮廓。生成轮廓的方法是基于像素幅值进行的操作。像素幅值可以简单理解为该部分像素值变化的剧烈程度,边缘的幅值普遍大于纯色背景的幅值。

Lthread是边缘提取迟滞阈值的低阈值。当像素幅值1低于低阈值后,该位置则不产生边缘;

Hthread是边缘提取迟滞阈值的高阈值。当像素的幅值高于高阈值时边缘将被保留。介于两参数之间的像素中,若有与高阈值像素相邻的则也会被视为边缘。

c3d22a5596bb42d89fb207b3c8be2465.png

        在保证背景干净以及目标轮廓特征突出的情况下,我们可以通过调试这两个参数获取到目标物的轮廓,接着就能够将其作为模板进行模板的创建了。

  文章所属:@广州研为

1.3创建模板

        创建形状模板一共有多个方法可以选:create_shape_model, create_shape_model_xld, create_scaled_shape_model…,在这里我们介绍的是create_shape_model_xld:通过xld轮廓创建的模板匹配与模板具有近似形状且大小不变的轮廓ID(ModelID)。

        create_shape_model_xld(Contours, NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, MinContrast, ModelID)

        创建模板所使用的参数非常多,但部分参数是能够使用”auto”关键字自动检测并补齐的,所以刚开始接触的同学不用太苦恼,在学习使用一段时间后回来了解也不算晚,接下来讲解的是不带有自动生成的参数:

AngleStart, AngleExtent:模板轮廓能旋转的起始角度以及范围,这与模板在进行匹配时所用的角度范围相关,它与find_shape_models中所使用的角度范围关系是:create_shape_model_xld角度范围包含find_shape_models角度范围。

注意:参数填写的单位是弧度,并不是我们日常中所使用的角度单位。

Metric:决定了图像在识别中模型的条件。一般情况下,我们使用默认的“ ignore_local_polarity”就可以。

        “ use_polarity”图像的目标于模型必须具有相同对比度

        “ ignore_global_polarity”图像目标于模型对比度相反也能找到

        “ ignore_local_polarity'”图像目标即使局部发生对比度的变化也能被找到。在这种情况下会花费较多的时间找到目标的时间,为了提高搜索速度,可以针对多种对比度的情况分别创建对应模板,使用多个模板一起进行搜索。使用多个模板进行搜索,这种创建模板的方式我们也进行了介绍:正在施工中~,可前往个人主页查看文章

        剩下的部分条件这里就不多讲啦,大家可以自行在Halcon的使用手册上阅读,这部分讲解的也是比较通俗易懂的

注意:“ use_polarity”和“ ignore_global_polarity”只能在定义了边缘极性时才能使用,例如通过edges_sub_pix创建的边缘。

MinContrast:模板轮廓在图像目标中进行识别的最小对比度。当图像目标位于较暗的场景,可适当降低该值让目标更容易被发现,但较低的值会增加将背景噪声识别为目标的概率。


 总结

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

        由于篇幅限制,后续内容在Halcon开发教程:模板匹配参数详解(下篇)中,需要继续观看的同学可继续跳转至此处。

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

;