基于形状匹配的模板匹配halcon实现

您所在的位置:网站首页 Halcon模板匹配误差偏大 基于形状匹配的模板匹配halcon实现

基于形状匹配的模板匹配halcon实现

2024-05-28 00:27| 来源: 网络整理| 查看: 265

HALCON提供的基于形状匹配的算法主要是针对感兴趣的小区域(region)来建立模板,基本流程如下所示:

一、步骤

⑴ 首先确定出ROI的矩形区域,对于规则区域,可以使用ROI助手,手动绘制。比如gen_rectangle1()这个函数就会帮助你生成一个矩形,利用area_center()找到这个矩形的中心;如果是不规则的区域,就使用Blob分析,抠图,得到想要的区域。

⑵ 然后需要从图像中获取这个矩形区域的图像,reduce_domain()会得到这个ROI;这之后就可以对这个矩形建立模板,而在建立模板之前,可以先对这个区域进行一些处理,方便以后的建模,比如数学形态学的一些处理,腐蚀,膨胀等等;

⑶ 接下来就可以利用create_shape_model()来创建模板了,这个函数有许多参数,其中金字塔的级数由Numlevels指定,值越大则找到物体的时间越少,AngleStart和AngleExtent决定可能的旋转范围,AngleStep指定角度范围搜索的步长;这里需要提醒的是,在任何情况下,模板应适合主内存,搜索时间会缩短。对特别大的模板,用Optimization来减少模板点的数量是很有用的;MinConstrast将模板从图像的噪声中分离出来,如果灰度值的波动范围是10,则MinConstrast应当设为10;Metric参数决定模板识别的条件,如果设为’use_polarity’,则图像中的物体和模板必须有相同的对比度;创建好模板后,这时还需要监视模板,用inspect_shape_model()来完成,它检查参数的适用性,还能帮助找到合适的参数;另外,还需要获得这个模板的轮廓,用于后面的匹配,get_shape_model_contours()则会很容易的帮我们找到模板的轮廓;

⑷ 创建好模板后,就可以打开另一幅图像,来进行模板匹配了。这个过程也就是在新图像中寻找与模板匹配的图像部分,这部分的工作就由函数find_shape_model()来承担了,它也拥有许多的参数,这些参数都影响着寻找模板的速度和精度。这个的功能就是在一幅图中找出最佳匹配的模板,返回一个模板实例的长、宽和旋转角度。其中参数SubPixel决定是否精确到亚像素级,设为’interpolation’,则会精确到,这个模式不会占用太多时间,若需要更精确,则可设为’least_square’,’lease_square_high’,但这样会增加额外的时间,因此,这需要在时间和精度上作个折中,需要和实际联系起来。比较重要的两个参数是MinSocre和Greediness,前一个用来分析模板的旋转对称和它们之间的相似度,值越大,则越相似,后一个是搜索贪婪度,这个值在很大程度上影响着搜索速度,若为0,则为启发式搜索,很耗时,若为1,则为不安全搜索,但最快。在大多数情况下,在能够匹配的情况下,尽可能的增大其值。

⑸ 找到之后,还需要对其进行转化,使之能够显示,这两个函数vector_angle_to_rigid()和affine_trans_contour_xld()在这里就起这个作用。前一个是从一个点和角度计算一个刚体仿射变换,这个函数从匹配函数的结果中对构造一个刚体仿射变换很有用,把参考图像变为当前图像。

二、实例

原图

使用Blob分析找到目标区域,裁剪,创建如下模板

源码:

* This example demonstrates how to create a model for * scale invariant shape-based matching. * * dev_update_off () dev_close_window () * * Acquire image read_image (Image, 'green-dot') dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) dev_display (Image) * * Set display settings set_display_font (WindowHandle, 16, 'mono', 'true', 'false') dev_set_draw ('margin') dev_set_color ('green') dev_set_line_width (3) Message := 'This example shows how to create a shape model' Message[1] := 'for scale invariant matching and how to save' Message[2] := 'it in a file.' disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true') disp_continue_message (WindowHandle, 'black', 'true') stop () * * Segment the template region threshold (Image, Region, 0, 128) connection (Region, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10000, 20000) fill_up (SelectedRegions, RegionFillUp) dilation_circle (RegionFillUp, RegionDilation, 5.5) dev_display (Image) dev_display (RegionDilation) disp_message (WindowHandle, 'Template region', 'window', 12, 12, 'black', 'true') disp_continue_message (WindowHandle, 'black', 'true') stop () * * Create the shape model reduce_domain (Image, RegionDilation, ImageReduced) inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 1, 40) create_scaled_shape_model (ImageReduced, 5, rad(-45), rad(90), 0, 0.8, 1.0, 0, ['none','no_pregeneration'], 'ignore_global_polarity', 40, 10, ModelID) dev_display (Image) dev_display (ModelRegions) disp_message (WindowHandle, 'Regions of the shape model', 'window', 12, 12, 'black', 'true') disp_continue_message (WindowHandle, 'black', 'true') stop () * * Save the model in a file write_shape_model (ModelID, 'green-dot.shm') Message := 'The shape model has been saved in the file' Message[1] := '\'green-dot.shm\'.' disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true') disp_end_of_program_message (WindowHandle, 'black', 'true') * * Clear the model clear_shape_model (ModelID)

参考https://blog.csdn.net/qingzhuyuxian/article/details/89924944



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3