搜档网
当前位置:搜档网 › HALCON形状匹配总结

HALCON形状匹配总结

HALCON形状匹配总结
HALCON形状匹配总结

HALCON形状匹配总结

Halcon有三种模板匹配方法:即Component-Based、Gray-Value-Based、Shaped_based,分别是基于组件(或成分、元素)的匹配,基于灰度值的匹配和基于形状的匹配,

此外还有变形匹配和三维模型匹配也是分属于前面的大类

本文只对形状匹配做简要说明和补充:

Shape_Based匹配方法:

上图介绍的是形状匹配做法的一般流程及模板制作的两种

方法。

先要补充点知识:形状匹配常见的有四种情况一般形状匹配模板shape_model、线性变形匹配模板

planar_deformable_model、局部可变形模板

local_deformable_model、和比例缩放模板Scale_model

第一种是不支持投影变形的模板匹配,但是速度是最高的,

第二种和第四种是支持投影变形的匹配,第三种则是支持局

部变形的匹配。

一般形状匹配模板是最常用的,模板的形状和大小一经制作

完毕便不再改变,在查找模板的过程中,只会改变模板的方

向和位置等来匹配目标图像中的图像。这个方法查找速度很

快,但是当目标图像中与模板对应的图像存在比例放大缩小

或是投影变形如倾斜等,均会影响查找结果。涉及到的算子

通常为create_shape_model 和find_shape_model

线性变形匹配模板planar_deformable_model是指模板在行列方向上可以进行适当的缩放。行列方向上可以分别独立的

进行一个适当的缩放变形来匹配。主要参数有行列方向查找

缩放比例、图像金字塔、行列方向匹配分数(指可接受的匹

配分数,大于这个值就接受,小于它就舍弃)、设置超找的角度、已经超找结果后得到的位置和匹配分数

线性变形匹配又分为两种:带标定的可变形模板匹配和不带

标定的可变形模板匹配。涉及到的算子有:

不带标定的模板:创建和查找模板算子

create_planar_uncalib_deformable_model和

find_planar_uncalib_deformable_model

带标定模板的匹配:先读入摄像机内参和外参

read_cam_par 和read_pose 创建和查找模板算子create_planar_calib_deformable_model和

find_planar_calib_deformable_model

局部变形模板是指在一张图上查找模板的时候,可以改变

模板的尺寸,来查找图像上具有局部变形的模板。例如包装

纸袋上图案查找。参数和线性变形额差不多

算子如下:create_local_deformable_model和

find_local_deformable_model

比例缩放末班匹配是介于一般形状匹配和线性变形匹配之

间的一种方法。它可以匹配放大或是缩小的模板,但是仅限

于模板大小的缩放,即行列缩放因子一样。这也是它和线性

缩放最大的不同。

涉及到的算子如下:create_scale_shape_model和

find_scale_shape_model

HALCON形状匹配

LIntExport Herror

create_shape_model(const Hobject& Template ,

//reduce_domain后的模板图像

Hlong NumLevels, //金字塔的层数,可设为“auto”或0—10的整数

Double AngleStart, //模板旋转的起始角度

Double AngleExtent, //模板旋转角度范围, >=0 Double AngleStep, //旋转角度的步长,>=0 and

<=pi/16

const char* Optimization, //设置模板优化和模板创建方

const char* Metric, //匹配方法设置

Hlong Contrast, //设置对比度

Hlong MinContrast , //设置最小对比度

Hlong* ModelID ) //输出模板句柄

进一步分析:

NumLevels越大,找到匹配使用的时间就越小。另外必须保证最高层的图像具有足够的信息(至少四个点)。可以通过inspect_shape_model函数查看设置的结果。如果最高层金

字塔的消息太少,算法内部会自动减少金字塔层数,如果最

底层金字塔的信息太少,函数就会报错。如果设为auto,算法会自动计算金字塔的层数,我们可以通过

get_shape_model_params函数查看金字塔的层数。如果金

字塔的层数太大,模板不容易识别出来,这是需要将

find_shape_model函数中MinScore和Greediness参数设置的低一些。如果金字塔层数太少找到模板的时间会增加。

可以先使用inspect_shape_model函数的输出结果来选择一个较好的金字塔层数。

参数AngleStart、AngleExtent定义了模板可能发生旋转的

范围。注意模板在find_shape_model函数中只能找到这个

范围内的匹配。参数AngleStep定义了旋转角度范围内的步长。如果在find_shape_model函数中没有指定亚像素精度,这个参数指定的精度是可以实现find_shape_mode函数中的角度的。参数AngleStep的选择是基于目标的大小的,如

果模板图像太小不能产生许多不同离散角度的图像,因此对

于较小的模板图像AngleStep应该设置的比较大。如果

AngleExtent不是AngleStep的整数倍, 将会相应的修改AngleStep 。

如果选择complete pregeneration ,不同角度的模板图像

将会产生并保存在内存中。用来存储模板的内存与旋转角度

的数目和模板图像的的点数是成正比的。因此,如果AngleStep太小或是AngleExtent太大, 将会出现该模型不

再适合(虚拟)内存的情况。在任何情况下,模型是完全适

合主存储器的,因为这避免了操作系统的内存分页,使得寻

找匹配模板的时间变短。由于find_shape_model函数中的

角度可以使用亚像素精度,一个直径小于200像素的模板可

以选择AngleStep >= 1. 如果选择AngleStep=’auto’ (or 0 向后兼容), create_shape_model将会基于模板的大小自动

定义一个合适的角度步长. 自动计算出来的AngleStep 可

以使用get_shape_model_params函数查看。

如果没有选择complete pregeneration, 该模型会在每一层

金字塔上建立在一个参考的位置。这样在find_shape_model

函数运行时,该模型必须转化为不同的角度和尺度在运行时

在。正因为如此,匹配该模型可能需要更多的时间。

对于特别大的模板图像,将参数Optimization设置为不同

于’none’的其他数值是非常有用的。如果Optimization =

所有的模型点将要存储。在其他情况下, 按照

‘none’,

Optimization的数值会将模型的点数减少. 如果模型点数变

少了,必须在find_shape_model函数中将参数Greediness

设为一个比较小的值, 比如:0.7、0.8。对于比较小的模型, 减

少模型点数并不能提高搜索速度,因为这种情况下通常显着

更多的潜在情况的模型必须进行检查。如果Optimization设

create_shape_model自动确定模型的点数。

置为’auto’,

Optimization的第二个值定义了模型是否进行预处理(pregenerated completely),是通过选择’pregeneration’或者’no_pregeneration’来设置的。如果不使用第二个值(例

如:仅仅设置了第一个值), 默认的是系统中的设置,是通过

set_system(‘pregenerate _shape_models’,…)来

设置的,

对于默认值是(‘pregenerate_shape_models’ = ‘false’), 型没有进行预处理. 模型的预处理设置通常会导致比较低的

运行时间,因为模型不需要在运行时间时转换。然而在这

种情况下,内存的要求和创建模板所需要的时间是比较高的。

还应该指出,不能指望这两个模式返回完全相同的结果,因

为在运行时变换一定会导致变换模型和预处理变换模型之

间不同的内部数据。比如,如果模型没有completely pregenerated,在find_shape_model函数中通常返回一个

较低的scores,这可能需要将MinScore设置成一个较低的

值。此外,在两个模型中插值法获得的位置可能略有不同。

如果希望是最高精确度,应该使用最小二乘调整得到模型位

置。

参数Contras决定着模型点的对比度。对比度是用来测量目

标与背景之间和目标不同部分之间局部的灰度值差异。

Contrast的选择应该确保模板中的主要特征用于模型中。

Contrast也可以是两个数值,这时模板使用近似

edges_image函数中滞后阈值的算法进行分割。这里第一个

数值是比较低的阈值,第二个数值是比较高的阈值。Contrast

也可以包含第三个,这个数值是在基于组件尺寸选择重要模

型组件时所设置的阈值,比如,比指定的最小尺寸的点数还

少的组件将被抑制。这个最小尺寸的阈值会在每相邻的金字

塔层之间除以2。如果一个小的模型组件被抑制,但是不使

用滞后阈值,然而在Contrast中必须指定三个数值,在这种

情况下前两个数值设置成相同的数值。这个参数的设置可以

在inspect_shape_model函数中查看效果。如果Contrast

create_shape_model将会自动确定三个上面

设置为’auto’,

描述的数值。或者仅仅自动设置对比度(‘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

函数检查效果。

MinContrast用来确定在执行find_shape_model函数进行识

别时模型的哪一个对比度必须存在,也就是说,这个参数将

模型从噪声图像中分离出来。因此一个好的选择应该是在图

像中噪声所引起的灰度变化范围。例如,如果灰度浮动在10

个灰度级内,MinContrast应该设置成10。如果模板和搜索

图像是多通道图像,Metric参数设置

成’ignore_color_polarity’,在一个通道中的噪声必须乘以通道个数的平方根再去设置MinContrast。例如,如果灰度值

在一个通道的浮动范围是10个灰度级,图像是三通道的,

那么MinContrast应该设置为17。很显然,MinContrast 必

须小于Contrast。如果要在对比度较低的图像中识别模板,MinContrast必须设置为一个相对较小的数值。如果要是模

板即使严重遮挡(occluded)也能识别出来,MinContrast

应该设置成一个比噪声引起的灰度浮动范围略大的数值,这

样才能确保在find_shape_model函数中提取出模板准确的

最小对比

位置和旋转角度。如果MinContrast设置为’auto’,

度会基于模板图像中的噪声自动定义。因此自动设定仅仅在

搜索图像和模板图像噪声近似时才可以使用。此外,在某些

情况下为了遮挡的鲁棒性,采用自动设定数值是比较好的。

使用get_shape_model_params函数可以查询自动计算的最

小对比度。

参数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_pol 即使颜色对比度局部变化也能找到模型。例如,当目arity’,

标的部分区域颜色发生变化(e.g.从红到绿)的情况。如果不能

提前知道目标在哪一个通道是可见的这种模式是非常有用

的。在这种情况下find_shape_model函数的运行时间也会

急剧增加。’ignore_color_polarity’可以使用于具有任意通道数目的图像中。如果使用于单通道图像,他的效果

Metric =

和’ignore_loc al_polarity’是完全相同的。当

‘ignore_color_polarity’ 

时,

create_shape_model创建的模板通道数目和

find_shape_model中的图像通道数目可以是不同的。例如,

可以使用综合生成的单通道图像创建模型。另外,这些通道

不需要是经过光谱细分(像RGB图像)的。这些通道还可以包

括具有在不同方向照亮同一个目标所获得的图像。

模型图像Template的domain区域的重心是模板的初始位置,

可以在set_shape_model_origin函数中设置不同的初始位

置。

LIntExport Herror find_shape_model(const Hobject&

Image, //搜索图像

Hlong ModelID, //模板句柄

Double AngleStart, // 搜索时的起始角度

Double AngleExtent, //搜索时的角度范围,必须与创建模

板时的有交集。

Double MinScore, // 输出的匹配的质量系数Score 都

得大于该值

Hlong NumMatches, // 定义要输出的匹配的最大个数Double MaxOverlap, // 当找到的目标存在重叠时,且重

叠大于该值时选//择一个好的输出

const char* SubPixel, // 计算精度的设置,五种模式,多选2,3

Hlong NumLevels, // 搜索时金字塔的层数

Double Greediness , //贪婪度,搜索启发式,一般都设为0.9,越高速度快//容易出现找不到的

情况

Halcon::HTuple* Row, //输出匹配位置的行坐标

Halcon::HTuple* Column, //输出匹配位置的列坐标Halcon::HTuple* Angle, //输出匹配角度

Halcon::HTuple* Score ) //输出匹配质量

进一步分析:

注意Row、Column的坐标并不是模板在搜索图像中的精确

位置,因此不能直接使用他们。这些数值是为了创建变换矩

阵被优化后的,你可以用这个矩阵的匹配结果完成各种任务,

比如调整后续步骤的ROI。

Score是一个0到1之间的数,是模板在搜索图像中可见比

例的近似测量。如果模板的一半被遮挡,该值就不能超过0.5。Image的domain定义了模型参考点的搜索区域,模型参考

点是在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°、A ngleExtent=20°,尽管角度模360后

是重叠的,还是会找不到模板的。为了找到模板,在这个例

子中必须将AngleStart=350°改为AngleStart=-10°。

参数MinScore定义模板匹配时至少有个什么样的质量系数

才算是在图像中找到模板。MinScore设置的越大,搜索的就

越快。如果模板在图像中没有被遮挡,MinScore可以设置

为0.8这么高甚至0.9。

NumMatches定义了在图像上找到模板的最大的个数。如果

匹配时的质量系数大于MinScore的目标个数多于

NumMatches,仅仅返回质量系数最好的NumMatches个目

标位置。如果找的匹配目标不足NumMatches,那么就只返

回找到的这几个。参数MinScore优于NumMatches。

如果模型具有对称性,会在搜索图像的同一位置和不同角度

上找到多个与目标匹配的区域。参数MaxOverlap是0到1

之间的,定义了找到的两个目标区域最多重叠的系数,以便

于把他们作为两个不同的目标区域分别返回。如果找到的两

个目标区域彼此重叠并且大于MaxOverlap,仅仅返回效果

最好的一个。重叠的计算方法是基于找到的目标区域的任意

方向的最小外接矩形(看smallest_rectangle2)。如果

MaxOverlap=0, 找到的目标区域不能存在重叠, 如果

MaxOverla p=1,所有找到的目标区域都要返回。

SubPixel确定找到的目标是否使用亚像素精度提取。如果

背景兼容),模型的位置

SubPixel设置为’none'(或者’false’ 

仅仅是一个像素精度和在create_shape_model中定义的角

度分辨率。如果SubPixel设置为’interpo lation'(或’true’),位置和角度都是亚像素精度的。在这种模式下模型的位置是

在质量系数函数中插入的,这种模式几乎不花费计算时间,

并且能达到足够高的精度,被广泛使用。然而在一些精度

要求极高的应用中,模板的位置应该通过最小二乘调整决定,

比如通过最小化模板点到相关图像点的距离。与

‘interpolation’相比,这种模式需要额外的计算时间。对于最

小二乘调整的模式有:’least_squares’, ‘least_squares_high’,

他们可用来定义被搜索的最小

和’least_squares_very_high’。

距离的精度,选择的精度越高,亚像素提取的时间越长。然

如果希望设置最小

而,通常SubPixel设置为’interpolation’。

因为这样才能确保运行时间和

二乘就选择’least_squares’,

精度的权衡。

NumLevels是在搜索时使用的金字塔层数,如有必要,层数

截成创建模型时的范围。如果NumLevels=0,使用创建模板

时金字塔的层数。另外NumLevels还可以包含第二个参数,

这个参数定义了找到匹配模板的最低金字塔层数。

NumLevels=[4,2]表示匹配在第四层金字塔开始,在第二层

金字塔找到匹配(最低的设为1)。可以使用这种方法降低匹

配的运行时间,但是这种模式下位置精度是比正常模式下低

的,所谓正常模式是在金字塔最底层匹配。因此如果需要较

高的精度,应该设置SubPixel至少为’least_squares’。如果

金字塔最底层设置的过大,可能不会达到期望的精度,或者

找到一个不正确的匹配区域。这是因为在较高层的金字塔上

模板是不够具体的,不足以找到可靠的模板最佳匹配。在这

种情况下最低金字塔层数应设为最小值。

参数Greediness确定在搜索时的“贪婪程度”。如果Greediness=0,使用一个安全的搜索启发式,只要模板在图像中存在就一定能找到模板,然而这种方式下搜索是相对浪

费时间的。如果Greediness=1,使用不安全的搜索启发式,这样即使模板存在于图像中,也有可能找不到模板,但只是

少数情况。如果设置Greediness=0.9,在几乎所有的情况下,总能找到模型的匹配。

相关主题