halcon手册——匹配matching

转载原链接点此
该文主要参考来自halcon自带的手册《solution_guide_ii_b_matching》
一般在安装目录中能找到,或者按F1,打开帮助也能找到英文版原材料

Part1

1. matching指的是从一张图片中找出既有对象的位置的方法,这些方法可以应用来很多不同的领域。匹配的主要方式是使用一个所找对象的模板,创建一个模型来用于在图片中搜索。
在halcon中,主要有两大类匹配方法,一类使用对象的灰度值以及像素点和周边像素的关系来建立匹配模型,另一类则根据对象的轮廓形状来进行匹配。匹配的输出信息通常为图片中的位置信息,一般应用中,也会需要尺度,角度等相关信息。

2. 匹配的大体步骤:
(a)创建一个对象的特征模型用于后续匹配
一个对象的模型指的是一个用来描述所搜索对象的内在特点的数据结构, 模型通常可以用对象的标准图片或者合成模型。创建方法取决于具体应用
(b)在测试图中找到相应对象模型
(c)清除模型内存

3. 可选的匹配方法
A、通过描述灰度值以及周边像素的关系来创建模型的方法
(1)标准灰度值匹配法
相关性匹配法,这种方法试用了Normalized Cross correlation(NCC)方法来进行匹配
(此算法参见《机器视觉算法与应用》的书)
B、通过描述对象的轮廓和边界来创建匹配模型
(1)根据形状来匹配、
(2)根据内容来匹配,这种方法主要用于特殊的情况:对象的几个部分存在相互关系,一部分随着另一部分运动的情况
(3)局部变动匹配法,这个方法可以返回可变对象的模型,允许细微的修改图像相应的的局部区域
(4)透视变动匹配法,这个方法可以处理真正的3D对象(而非由2D图像的各种参数来计算出的3D模型)
(5)描述符匹配法,通过匹配一些interest 点来进行匹配,同样可以处理3D对象的匹配。

4、方法的选择
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

Part2

二、匹配过程
通常的匹配过程是首先准备参照图片和样板,并用他们创建匹配模型,修改这个模型(如果需要),并保存这个模型以及他的相关搜索索引,用于以后重复使用,下面是进行模型搜索并输出结果,最后清空内存。

1、 创建一个样板image template并建立模型(model)
在对参考图片进行一系列预处理之后,匹配过程的第一步就是创建所找对象的一个样板。在很多情况下,model来源于参考图,它是参考图经过选择性剪切后留下的样板图template image。对于另外一些匹配方法,并没有直接从参考图中剪出样板图,而是通过多张参考图来合成出一个新的样板图片template image或者是XLD格式的边界

1.1 从参考图片中直接剪出样板图片
选择出用于模型的区域(可以是任意形状),用reduce_domain剪切出ROI区域,即样板图片,可用于上述生成模型的方法的输入。
@ 通过输入参数来创建一个region:使用Operatiors》Regions》Creation。如果形状比较复杂,可以考虑使用draw 操作来画出需要的区域。

@通过图像处理来选择区域:blob analysis,segment。 通过用threshold操作,connection,fill_up, select_shape操作来获取形状。除此之外,可以用visualization》feature inspection来选取合适的特征或者值。更复杂的情况可以通过用union2和difference操作来选取复杂的样板图形。

1.2 合成的样板
@合成一个样板图片
合成的样板图片主要适用于相关性匹配(correlation-based matching)和一些基于边界的2D方法。在一些应用中,例如硬币检测(见下图),可能单纯的从参考图片中提取样板图非常复杂,没有任何图片可以直接剪切出来作为合适的样板(因为都有误差),如果简单地剪切出样板,进行匹配时候由于ROI区域不可避免的存在错误,会导致部分应选的输出结果没有被选择,解决这个问题的办法就是用ring shape 来代替circle shape,减少了误差存在的中心区域,可以很大的提高样板的适用性,可以使用合成样板。
这里写图片描述

下面介绍如何创建这样一个合成的样板模型:
step 1:创建一个XLD边界
使用gen_ellipse_contour_xld或者手动选择ROI或者使用形态学处理,产生一个感兴趣对象的边界。注意合成的图片应该比实物稍微大一些因为所有在region外面的像素点都在创建图像金字塔时候被使用(基于形状的匹配)。

step 2: 创建一个空白的图片,然后插入这个XLD边界
使用gen_image_const来创建图片,并且用paint_xld来插入边界
gen_image_const (EmptyImage, ‘byte’, SizeSynthImage, SizeSynthImage)
paint_xld (Circle, EmptyImage, SyntheticModelImage, 128)

step 3: 创建模型
根据图片创建模型
create_scaled_shape_model (SyntheticModelImage, ‘auto’, 0, 0, 0.01, 0.8,
1.2, ‘auto’, ‘none’, ‘use_polarity’, 30, 10,
ModelID)
或者create_shape_model, create_aniso_shape_model来建立模型

1.3 使用XLD边界来创建模型
同样是上面的问题,除了合成样板,还可以通过减少错误区域的方式来解决问题。当使用基于形状的匹配方法时候并不需要使用边界合成一个样板图片,而是可以直接用XLD边界作为模型(不需要提供样板图片)
用户只需要使用create_shape_model_xld, create_scaled_shape_model_xld 或者 create_aniso_shape_model_xld来创建模型(注意这里的输入仅仅是XLD边界)。

下面是在create_shape_model_xld.dev例子中,具体基于形状的匹配法中创建模型(边界是输入):
gen_circle_contour_xld (ContCircle, 300, 300, MeanRadius, 0, 6.28318,
‘positive’, 1)
create_shape_model_xld (ContCircle, ‘auto’, 0, 0, ‘auto’, ‘auto’,
‘ignore_local_polarity’, 10, ModelID)

对于另外的方法,create_local_deformable_model_xld for the local
deformable matching(可变匹配法)和create_planar_uncalib_deformable_model_xld 或者create_planar_calib_deformable_model_xld, 用在 perspective deformable matching(透视匹配法).

注意:因为使用边界作为输入时候没有任何极性(polarity即角度方向偏转位移等信息)信息,所以必须规定Metric属性来确定尺度标准(极性被忽略),但问题是,这样做会是搜索变得缓慢,所以halcon提供了途径来检测一个实例中的polarity信息。如下:
如下图,首先在一张包含典型极性信息的搜索图片中使用慢速搜索,用得到的信息来设置。把模型的边界投射到找到的位置,然后使用下面语句( set_shape_model_metrix)来设置基于形状的匹配,使用(set_local_deformable_model_metric)来设置局部可变匹配法,使用(set_planar_uncalib_deformable_model_metric或者set_planar_calib_deformable_model_metric)来设置透视可变匹配法。在做完这些后,polarity信息就被存储到model中了(Metric可以被设定为 ’ use_polarity’),从而一高速度和效果。
这里写图片描述

例子:
这里写图片描述

1.4 使用DXF文件来创建model,可以用read_contour_xld_dxf来读取边界,具体信息这里先不讨论。

2、模型的重复利用,具体参考solution:
2.1 保存
write_shape_model (ModelID, ModelFile)
但是模型中的region并没有保存,如果需要重复使用,需要使用
ModelRegionFile := ‘model_region_nut.png’
write_image (ImageROI, ‘png’, 0, ModelRegionFile)
然后清除
clear_shape_model (ModelID)
2.2 读取
read_shape_model (ModelFile, ReusedModelID)
get_shape_model_contours (ReusedShapeModel, ReusedModelID, 1)
get_shape_model_origin (ReusedModelID, ReusedRefPointRow, ReusedRefPointCol)
get_shape_model_params (ReusedModelID, NumLevels, AngleStart, AngleExtent, \
AngleStep, ScaleMin, ScaleMax, ScaleStep, Metric, \
MinContrast)

读取region
read_image (ImageModelRegion, ‘model_region_nut.png’)
get_domain (ImageModelRegion, DomainModelRegion)

后面可以直接进行find_shape_model等操作,相当于已经创建了模型
这里写图片描述

3、模型匹配后的结果
这里写图片描述
这里写图片描述

4、图像旋转平移变换
这里写图片描述

猜你喜欢

转载自blog.csdn.net/im6520/article/details/75007707