halcon模板匹配之shape/ncc模板匹配参数详解

Shape模板匹配

create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast : ModelID)

注:转载请保留原文地址https://blog.csdn.net/baidu_36363174/article/details/105846684

参数:
NumLevels 金字塔层数越大,计算次数越快。【但采样过程中,图像信息减少,匹配的精确性会降低,特别是层数特别高的时候,这时候如果关键信息丢失了,粗匹配偏差大了或者匹配错了,后续精匹配也无法矫正过来】【注意采样的方式—去噪能力,保留图像关键信息的能力】
【0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ‘auto’。如果最高层金字塔的消息太少,算法内部会自动减少金字塔层数,如果最底层金字塔的信息太少,函数就会报错。如果设为auto,算法会自动计算金字塔的层数,我们可以通过get_shape_model_params函数查看金字塔的层数。如果金字塔的层数太大,模板不容易识别出来,这时需要将find_shape_model函数中MinScore和Greediness参数设置的低一些。如果金字塔层数太少找到模板的时间会增加。可以先使用inspect_shape_model函数的输出结果来选择一个较好的金字塔层数。】
AngleStart,AngleExtent,AngleStep: 模板可能的旋转范围和角度范围搜索步长。
①对于小模版,搜索步长应该适当的大,因为较小的模型在图像中没有很多不同离散旋转。举个例子,4个像素点的矩形模板,你旋转个0.01度匹配像素的其实还是那样。
②AngleExtent应该是AngleStep的整数倍。
③范围取值{[-3.14,0][0,6.28][AngleStep >= 0 && AngleStep <= pi / 16]}。如果选择 complete pregeneration,将会产生不同角度的模板图像并保存在内存中。用来存储模板的内存与旋转角度的数目和模板图像的点数是成正比的。因此,如果AngleStep太小或是AngleExtent太大, 将会出现该模型不再适合(虚拟)内存的情况。在任何情况下,模型是完全适合主存储器的,因为这避免了操作系统的内存分页,使得寻找匹配模板的时间变短。如果没有选择complete pregeneration, 该模型会在每一层金字塔上建立在一个参考的位置。这样在find_shape_model函数运行时,该模型必须转化为不同的角度和尺度在运行时在。正因为如此,匹配该模型可能需要更多的时间。如果选择AngleStep=‘auto’ (or 0 向容),create_shape_ model将会基于模板的大小自动定义一个合适的角度步长. 自动计算出来的AngleStep【一般我都设为自动,这个值自己设的话不是很好用】。可以使用get_shape_model_params函数查看。
Optimization: 模板点储存模式,有两个参数,第一个参数是确定是否减少模型点数,第二个参数是确定是否进行预处理
参数一:【 ‘auto’, ‘none’, ‘point_reduction_high’, ‘point_reduction_low’,
‘point_reduction_medium’】,设为’none’时,全点储存,若选择点较少时,匹配分值可能较低。对于小型模型,减少模型点数不会导致搜索速度加快,因为在这种情况下,通常必须检查明显更多的潜在模型实例。 如果将Optimization设置为“ auto”,则create_shape_model自动确定减少模型点的数量。
参数二:【‘pregeneration’,‘no_pregeneration’ 】。如果不使用第二个值(例如:仅仅设置了第一个值), 默认的是系统中的设置,是通过set_system (‘pregenerate _shape_models’…)来设置的,对于默认值是 (‘pregenerate_shape_models’ =‘false’), 模型没有进行预处理. 模型的预处理设置通常会导致比较低的运行时间(非常低,亲身实验),因为模型不需要在运行时间时转换。然而在这种情下,内存的要求和创建模板所需要的时间是比较高的。还应该指出,不能指望这两个模式返回完全相同的结果,因为在运行时变换一定会导致变换模型和预处理变换模型之间不同的内部数据。比如,如果模型没有 completely pregenerated,在find _shape_model函数中通常返回一个较低的scores,这可能需要将MinScore设置成一个较低的值。此外,在两个模型中插值法获得的位置可能略有不同。如果希望是最高精确度,应该使用最小二乘调整得到模型位置。【一般不会用pregeneration,占内存太多】

Metric: 定义了在图像中匹配模板的条件。如果Metric= ‘use_ polarity’ ,图像中的目标必须和模型具有一样的对比度。例如,如果模型是一个亮的目标在一个暗的背景上,那么仅仅那些比背景亮的目标可以找到。如果Metric= ‘ignore_global_polarity’,在两者对比度完全相反时也能找到目标。在上面的例子中,如果目标是比背景暗的也能将目标找到。find_shape_model函数的运行时间在这种情况下将会略微增加。如果Metric= ignore_local_polarity’, 即使局部对比度改变也能找到模型。例如,当目标包含一部分中等灰度,并且其中部分比较亮部分比较暗时,这种模式是非常有用的。由于这种模式下find_shape_model函数的运行时间显著增加,最好的方法是使用create_shape_model创建几个反映目标可能的对比度变化的模型,同时使用find_shape_models去匹配它们。上
面三个metrics仅仅适用于单通道图像。如果是多通道图像作为模板图像或搜索图像,仅仅第一个通道被使用。如果Metric=‘ignore_color_polarity’, 即使颜色对比度局部变化也能找到模型。例如,当目标的部分区域颜色发生变化(e.g.从红到绿)的情况。如果不能提前知道目标在哪一个通道是可见的,这种模式将非常有用。在这种情况下find_shape_model函数的运行时间也会急剧增。‘ignore_color_polarity’可以用于具有任意通道数目的图像中。如果使用于单通道图像,他的效果和’ignore_loc al_polarity’是完全相同的。【取值 :‘ignore_color_polarity’, ‘ignore_global_polarity’, ‘ignore_local_polarity’, ‘use_polarity’】
Contrast : 决定着模型点的对比度。对比度是用来测量目标与背景之间和目标不同部分之间局部的灰度值差异。Contrast的选择应该确保模板中的主要特征用于模型中。Contrast也可以是两个数值,这时模板使用近似edges_image函数中滞后阈值的算法进行分割。这里第一个数值是比较低的阈值,第二个数值是比较高的阈值。Contrast也可以包含第三个,这个数值是在基于组件尺寸选择重要模型组件时所设置的阈值,比如,比指定的最小尺寸的点数还少的组件将被抑制。这个最小尺寸的阈值会在每相邻的金字塔层之间除以2。如果一个小的模型组件被抑制,但是不使用滞后阈值,然而在Contrast中必须指定三个数值,在这种情况下前两个数值设置成相同的数值。这个参数的设置可以inspect_shape_model函数中查看效果。如果Contrast设置为’auto’,create_shape_model将会自动确定三个上面描述的数值。或者仅仅自动设置对比度(‘auto_contrast’),滞后阈值(‘auto_contrast_hyst’)或是最小尺寸(‘auto_min_size’)中一个。其他没有自动设置的数值可以按照上面的格式再进行设置。可以允许各种组合,例如:如果设置 [‘auto_contrast’,‘auto_min_size’],对比度和最小尺寸自动确定;如果设置[‘auto_min_size’,20,30],最小尺寸会自动设定,而滞后阈值被设为20和30。有时候可能对比度阈值自动设置的结果是不满意的,例如,由于一些具体应用的原因当某一个模型组件是被包含或是被抑制时,或是目标包含几种不同的对比度时,手动设置这些参数效果会更好。因此对比度阈值可以使用determine_shape_model_params函数自动确定,也可以在调用create_shape_model之前使用inspect_shape_mode函数检查效果。
【取值 ‘auto’, ‘auto_contrast’, ‘auto_contrast_hyst’, ‘auto_min_size’】
MinContrast : 模型搜索的最小对比度,小于该对比度不考虑。MinConstrast将模板从图像的噪声中分离出来,如果灰度值的波动范围是10,则MinConstrast应当设为10。
【取值 ‘auto’, 1, 2, 3, 5, 7, 10, 20, 30, 40 MinContrast < Contrast】

find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score)

参数:
Image: 定义了模型参考点的搜索区域,模型参考点是在create_shape_model中用来创建模型的图像的domain区域的重心。不考虑使用函数set_shape_model_origin设置不同的初始位置。在图像domain区域的这些点内搜索模型,其中模型完全属于这幅图像。这意味着如果模型超出图像边界,即使获得的质量系数(score)大于MinScore也不能找到模型。这种性能可以通过set_system(‘border_shape_models’,‘true’)改变,这样那些超出图像边界,质量系数大于MinScore的模型也能找到。这时那些在图像外面的点看作是被遮挡了,可以降低质量系数。在这种模式下搜索的时间将要增加。

参数AngleStart和AngleExtent 确定了模型搜索的旋转角度,如果有必要,旋转的范围会被截取成为create_shape_model函数中给定的旋转范围。这意味着创建模型和搜索时的角度范围必须真正的重叠。在搜索时的角度范围不会改变为模2*pi的。为了简化介绍,在该段落剩下的部分所有角度都用度来表示,而在find_shape_model函数中使用弧度来设置的。因此,如果创建模板时,AngleStart=-20°、AngleExtent=40°,在搜索模板函数find_shape_model中设置AngleStart=350°、AngleExtent=20°,尽管角度模360后是重叠的,还是会找不到模板的。为了找到模板,在这个例子中必须将AngleStart=350°改为AngleStart=-10°。

MinScore: 定义模板匹配时至少有个什么样的质量系数才算是在图像中找到模板。MinScore设置的越大,搜索的就越快。如果模板在图像中没有被遮挡,MinScore可以设置为0.8这么高甚至0.9。

NumMatches: 定义了在图像上找到模板的最大的个数。如果匹配时的质量系数大于MinScore的目标个数多于NumMatches,仅仅返回质量系数最好的NumMatches个目标位置。如果找的匹配目标不足NumMatches,那么就只返回找到的这几个。参数MinScore优于NumMatches。

MaxOverlap: 如果模型具有对称性,会在搜索图像的同一位置和不同角度上找到多个与目标匹配的区域。参数MaxOverlap是0到1之间的,定义了找到的两个目标区域最多重叠的系数,以便于把他们作为两个不同的目标区域分别返回。如果找到的两个目标区域彼此重叠并且大于MaxOverlap,仅仅返回效果最好的一个。重叠的计算方法是基于找到的目标区域的任意方向的最小外接矩形(看smallest_rectangle2)。如果MaxOverlap=0, 找到的目标区域不能存在重叠, 如果MaxOverla p=1,所有找到的目标区域都要返回。

SubPixel: 确定找到的目标是否使用亚像素精度提取。如果SubPixel设置为’none’(或者’false’ 背景兼容),模型的位置仅仅是一个像素精度和在create_shape_model中定义的角度分辨率。如果SubPixel设置为’interpolation’(或’true’),位置和角度都是亚像素精度的。在这种模式下模型的位置是在质量系数函数中插入的,这种模式几乎不花费计算时间,并且能达到足够高的精度,被广泛使用。然而在一些精度要求极高的应用中,模板的位置应该通过最小二乘调整决定,比如通过最小化模板点到相关图像点的距离。与 ‘interpolation’相比,这种模式需要额外的计算时间。对于最小二乘调整的模式有:‘least_squares’, ‘least_squares_high’, 和’least_squares_very_high’。他们可用来定义被搜索的最小距离的精度,选择的精度越高,亚像素提取的时间越长。然而,通常SubPixel设置为’interpolation’。如果希望设置最小二乘就选择’least_squares’, 因为这样才能确保运行时间和精度的权衡。
相对于模型略微变形的对象,在某些情况下无法找到,或者只能以较低的精度找到。对于此类对象,可以在参数SubPixel中额外传递最大允许的对象变形。变形必须以像素为单位指定。这可以通过传递可选的参数值’max_deformation’,后接0到32之间的整数值(在同一字符串中)来指定最大变形。例如,如果对象的形状可能相对于模型中存储的形状变形最多2个像素,则除了上述子像素模式之外,还必须在SubPixel中传递值“ max_deformation 2”提取,例如[[least_squares,‘max_deformation 2’]。传递值’max_deformation 0’对应于不允许变形的搜索,即,行为与未传递’max_deformation’相同。注意,最大变形的较高值通常会导致运行时间增加。此外,选择的变形值越高,找到错误的模型实例的风险就越高。当搜索小型物体或具有精细结构的物体时,这两个问题都会出现。这是因为这类变形较大的对象会丢失其特征形状,这对于鲁棒搜索很重要。还要注意,对于较大的变形,如果在物体附近存在杂波,则部分遮挡的物体的精度可能会降低。因此,应将最大变形选择得尽可能小,而仅在必要时选择。如果将’max_deformation’和AngleExtent都设置为大于0的值,则可能找不到近似旋转对称的对象。在这种情况下,可能会出现无法解决的歧义,并且匹配被拒绝为false。如果发生这种情况,请尝试将“ max_deformation”或“ AngleExtent”设置为0,或调整模型以减少对称性。当指定的变形大于0时,分数的计算取决于子像素提取的所选值。在大多数情况下,如果为子像素提取选择了“最小二乘”,“最小二乘高”或“最小二乘非常高”(请参见上文),则匹配得分会发生变化(与“无”或“内插”相比)。此外,如果选择最小二乘平差之一,则分数在增加最大变形时可能会增加,因为对于模型点,可以找到更多对应的图像点。为了获得有意义的得分值并避免错误匹配,我们建议始终将变形的余量与最小二乘平差相结合。
【取值 ‘none’, ‘interpolation’, ‘least_squares’, ‘least_squares_high’,
‘least_squares_very_high’, ‘max_deformation 1’, ‘max_deformation 2’,
‘max_deformation 3’, ‘max_deformation 4’, ‘max_deformation 5’, ‘max_deformation
6’】【max_deformation字符串中的数值是0到32之间的整数值】

NumLevels: 搜索时使用的金字塔层数,如有必要,层数截成创建模型时的范围。如果NumLevels=0,使用创建模板时金字塔的层数。另外NumLevels还可以包含第二个参数,这个参数定义了找到匹配模板的最低金字塔层数。NumLevels=[4,2]表示匹配在第四层金字塔开始,在第二层金字塔找到匹配(最低的设为1)。可以使用这种方法降低匹配的运行时间,但是这种模式下位置精度是比正常模式下低的,所谓正常模式是在金字塔最底层匹配。因此如果需要较高的精度,应该设置SubPixel至少为’least_squares’。如果金字塔最底层设置的过大,可能不会达到期望的精度,或者找到一个不正确的匹配区域。这是因为在较高层的金字塔上模板是不够具体的,不足以找到可靠的模板最佳匹配。在这种情况下最低金字塔层数应设为最小值。
【0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10】
补充:
当NumLevels=0时,使用创建模板时的金字塔级别。另外,NumLevels还可以包含第二个参数,这个参数定义了找到匹配模板的最低金字塔级别。例如:NumLevels=[4,2]表示在第4层开始匹配,在第2层找到匹配(其默认值为1)。可以使用这种方式降低运行时间,但是这种模式下的位姿参数是精度较低的。
如果输入图像质量太差,例如失焦,变形,噪声等,导致边缘信息丢失或变形,通常在最低金字塔层找不到匹配目标。然而,其边缘信息可能在更高的金字塔级别上是足够的。
另外,不同图像间,金字塔级别可能略有不同。为了方便对质量较差的图像匹配,在匹配时可以确定最低的金字塔级别。这里的技巧是,最低金字塔层可用负数指明。例如,如果NumLevels为[4,-2],匹配从第4层金字塔开始,跟踪到最低金字塔级别。如果在这层金字塔找不到匹配目标,继续降低金字塔级别进行搜索,把找到至少一个匹配目标的金字塔级别最为最低金字塔级别,并返回找到的目标。

Greediness: 确定在搜索时的“贪婪程度”。如果Greediness=0,使用一个安全的搜索启发式,只要模板在图像中存在就一定能找到模板,然而这种方式下搜索是相对浪费时间的。如果Greediness=1,使用不安全的搜索启发式,这样即使模板存在于图像中,也有可能找不到模板,但只是少数情况。如果设置Greediness=0.9,在几乎所有的情况下,总能找到模型的匹配。

Ncc模板匹配

create_ncc_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Metric : ModelID)

NumLevels:【0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ‘auto’】
AngleStart:【-3.14,0】
AngleExtent:【0,6.29】
AngleStep:【AngleStep >= 0 && AngleStep <= pi / 16,‘auto’】
Metric :【‘ignore_global_polarity’, ‘use_polarity’】

find_ncc_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels : Row, Column, Angle, Score)

AngleStart:【-3.14,0】
AngleExtent:【0,6.29】
MinScore:【0-1】
SubPixel:【‘false’, ‘true’】
NumLevels:【0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10】
NCC匹配的参数意义和shape相类似,但是参数选择性不如shape多

Shape模板匹配的形变

create_scaled_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, ScaleMin, ScaleMax, ScaleStep, Optimization, Metric, Contrast, MinContrast : ModelID)

find_scaled_shape_model(Image : : ModelID, AngleStart, AngleExtent, ScaleMin, ScaleMax, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Scale, Score)

create_aniso_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, ScaleRMin, ScaleRMax, ScaleRStep, ScaleCMin, ScaleCMax, ScaleCStep, Optimization, Metric, Contrast, MinContrast : ModelID)

find_aniso_shape_model(Image : : ModelID, AngleStart, AngleExtent, ScaleRMin, ScaleRMax, ScaleCMin, ScaleCMax, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, ScaleR, ScaleC, Score)

上述也是shape形状匹配。create_scaled_shape_model是各向同性的形状匹配(等比缩放),create_aniso_shape_model是各向异性的形状匹配(等比缩放)。参数解释和用法与之前的create_shape_model相同。

需要补充的是 1 模板匹配是先旋转和平移到中心点,然后缩放。在变换矩阵中添加缩放矩阵的时候,是 旋转矩阵*平移和旋转矩阵 *图像或区域。2 如果调用hom_mat2d_scale( : : HomMat2D, Sx, Sy, Px, Py : HomMat2DScale)函数,那生成的HomMat2DScale矩阵即旋转+平移+缩放的变换矩阵,直接用就行。注意,Px, Py 为匹配图像的中心 3 shape匹配因为有形变容差,所以匹配度要高,但是容易匹配偏。分两种情况,一种的大小偏差大,另一种是方向偏差大。大小偏差多是工件存在形状相似的干扰边;方向偏差是由于工件细微形变引起的——可以通过画直线边缘做模板来帮助实现角度定位。(拐角定大小,直线定方向)

2020/7/11日新加
今天去现场调试,发现shape匹配并不是太好,有匹配不到或者匹配偏了的,记录以下的几个相对有效的解决方法:(其实调参数还是主要的,但参数这一块文章前面介绍了,这里不再赘述)1 调试打光,因为工件对不同波段的光的反应不同,我的理解是找一种对工件反应比较稳定的光源组合(这里用的AOI光源),那么针对大批量产品,得到的图像比较稳定,这对于匹配的稳定有作用 2 在相机拍摄时进行延时,当时考虑到是不是相机连续拍照,偶尔拍的图像不是太稳定,差异较大,加上后效果还是有点的,但是改变不大 3 对相机做白平衡,之前机器过去没有调试相机白平衡,突然想到做一下白平衡,效果却出奇的好,最终还是白平衡解决了偶尔匹配失误的情况

  • 16
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Halcon模板匹配是一种常用的机器视觉技术,它可以在图像中精确定位和识别目标物体。在Halcon中,模板匹配是通过计算模板图像和待匹配图像之间的相似度来实现的。以下是Halcon模板匹配中一些重要的参数及其含义: 1. 模板图像:模板图像是已知的目标图像,用于与待匹配图像进行比较。模板图像可以通过图像采集设备获取,也可以通过Halcon软件生成。 2. 待匹配图像:待匹配图像是需要进行目标检测和定位的图像。待匹配图像可以通过图像采集设备获取,也可以通过Halcon软件生成。 3. 相似度:相似度是模板图像和待匹配图像之间的相似程度。在Halcon中,相似度通常使用灰度相关系数(Gray Similarity)或归一化互相关系数(Normalized Cross Correlation)来计算。 4. 匹配阈值:匹配阈值是指在匹配过程中用来确定目标是否被检测到的阈值。当相似度超过匹配阈值时,认为目标已被检测到。 5. 匹配模式:匹配模式是指匹配过程中使用的算法类型。在Halcon中,常用的匹配模式包括模板匹配(Template Matching)、形状匹配(Shape Matching)和区域匹配(Region Matching)等。 6. 匹配区域:匹配区域是指在待匹配图像中进行模板匹配的区域。通常情况下,匹配区域可以通过设定一个感兴趣区域(ROI)来实现。 7. 结果输出:匹配结果可以通过Halcon中的输出参数来实现。常用的输出参数包括匹配位置、相似度、匹配角度等。 以上是Halcon模板匹配中一些重要的参数及其含义,希望可以帮助您更好地了解和应用Halcon模板匹配技术。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值