【Halcon】模板匹配算子

1.create_ncc_model

函数原型create_ncc_model( Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Metric : ModelID )

功能:创建NCC模板,做匹配使用。参数AngleStartAngleExtent决定可能的旋转范围

参数列表

Template(in):单通道图像,它的区域可被创建为模板
NumLevels(in):金字塔的最大层级
AngleStart(in):模板的最小旋转
AngleExtent(in):旋转角度范围
AngleStep(in):角度步长
Metric(in):匹配标准
ModelID(out):模板句柄

可能前置项
draw_region
reduce_domain
threshold

可能后置项
find_ncc_model
get_ncc_model_params
clear_ncc_model
write_ncc_model
set_ncc_model_origin
set_ncc_model_param

可能替代项
create_shape_model
create_scaled_shape_model
create_aniso_shape_model
create_template_rot

2.create_shape_model

create_shape_model —创建一个形状模板用于匹配

函数原型:create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast : ModelID)

描述
        算子create_shape_model创建一个模板,在图像模板中传递,作为用于匹配的形状模型。模型的ROI作为模板域传递。

        输出参数ModelID是这个模型的句柄,在后续find_shape_mode调用中使用。模型图像模板域(区域)的重心作为模型的原点(参考点)。可以使用set_shape_model_origin设置不同的原点。该模型由多个图像金字塔级别生成,并存储在内存中。如果选择了模型的完整预生成,则将在每个级别上多次旋转生成模型。

参数
Template : : //reduce_domain后的模板图像
NumLevels,//金字塔的层数,可设为“auto”或0—10的整数
AngleStart,//模板旋转的起始角度
AngleExtent,//模板旋转角度范围, >=0
AngleStep,//旋转角度的步长, >=0 and <=pi/16
Optimization,//设置模板优化和模板创建方法
Metric, //匹配方法设置
Contrast,//设置对比度
MinContrast //设置最小对比度
ModelID //输出模板句柄

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

create_ncc_model与create_shape_model的不同:

当选取的特征明显且差异小时,选择两者的区别不大。

需要注意的是,NCC对遮挡和杂波以及图像中的非线性光照变化非常敏感。如果在有遮挡、杂乱或非线性照明变化的情况下发现模型,则应使用基于形状的匹配(如create_shape_model)执行搜索。

3.find_ncc_model

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

功能:用于NCC模板匹配,在图像中找到最佳匹配的NCC模板。
        参数AngleStart和AngleExtent决定被搜寻模板的角度旋转范围。搜索的角度旋转范围不适用于模运算2*pi。

        如果create_ncc_model使用AngleStart=-20和AngleExtent=40,而find_ncc_model用AngleStart=350和AngleExtent=20,该模板不会被找到,即使角度是重叠的(在模数运算法则内)。如果想要找到该模板,需将find_ncc_model的AngleStart置为-10。

        参数MinScore决定被匹配到的实例最小分数,该值越大,算法速度越快。

        参数NumMatches表示被找到的实例最大数,如果大于NumMatches的实例被找到,只有最佳的NumMatches个实例返回。如果小于NumMatches个的实例被找到,则找到几个就几个,因此MinScore的优先级大于NumMatches。

参数

Image(in):单通道图像,它的区域可被创建为模板
ModelID(in):模板句柄
AngleStart(in):模板的最小旋转
AngleExtent(in):旋转角度范围
MinScore(in):被找到的模板最小分数
NumMatches(in):被找到的模板个数
MaxOverlap(in):被找到的模板实例最大重叠部分
SubPixel(in):亚像素级别标志,true,false
NumLevels(in):金字塔层级数
Row(out):被找到的模板实例行坐标
Column(out):被找到的模板实例列坐标
Angle(out):被找到的模板实例的旋转角度
Score(out):被找到的模板实例的分数

4.find_shape_model

find_shape_model——在图像中找到形状模型的最佳匹配。
函数原型:find_shape_model(Image : : //搜索图像
                                ModelID, //模板句柄
                                AngleStart, // 搜索时的起始角度
                                AngleExtent, //搜索时的角度范围,必须与创建模板时的有交集
                                MinScore, //最小匹配值,输出的匹配的得分Score 大于该值
                                NumMatches, //定义要输出的匹配的最大个数
                                MaxOverlap, //当找到的目标存在重叠时,且重叠大于该值时选择一个好的输出
                                SubPixel, //计算精度的设置,五种模式,多选2,3
                                NumLevels, //搜索时金字塔的层数
                                Greediness : //贪婪度,搜索启发式,一般都设为0.9,越高速度快,容易出现找不到的情况
                                Row, Column, Angle, Score) //输出匹配位置的行和列坐标、角度、得分。

注意

  1. Row、Column的坐标并不是模板在搜索图像中的精确位置,因此不能直接使用他们。这些数值是为了创建变换矩阵被优化后的,你可以用这个矩阵的匹配结果完成各种任务,比如调整后续步骤的ROI。

  2. Score是一个0到1之间的数,是模板在搜索图像中可见比例的近似测量。如果模板的一半被遮挡,该值就不能超过0.5。

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

  4. 参数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°。

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

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

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

  8. 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’, 因为这样才能确保运行时间和精度的权衡。

  9. NumLevels是在搜索时使用的金字塔层数,如有必要,层数截成创建模型时的范围。如果NumLevels=0,使用创建模板时金字塔的层数。另外NumLevels还可以包含第二个参数,这个参数定义了找到匹配模板的最低金字塔层数。NumLevels=[4,2]表示匹配在第四层金字塔开始,在第二层金字塔找到匹配(最低的设为1)。可以使用这种方法降低匹配的运行时间,但是这种模式下位置精度是比正常模式下低的,所谓正常模式是在金字塔最底层匹配。因此如果需要较高的精度,应该设置SubPixel至少为’least_squares’。如果金字塔最底层设置的过大,可能不会达到期望的精度,或者找到一个不正确的匹配区域。这是因为在较高层的金字塔上模板是不够具体的,不足以找到可靠的模板最佳匹配。在这种情况下最低金字塔层数应设为最小值。

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

read_image(Image, 'board/board-01.png')
dev_open_window_fit_image(Image, 0, 0, -1, -1, WindowHandle)
dev_display(Image)
draw_rectangle1(WindowHandle, Row1, Column1, Row2, Column2)
gen_rectangle1(Rectangle, Row1, Column1, Row2, Column2)
*gen_rectangle1(Rectangle, 197, 186, 289, 405)
area_center(Rectangle, Area, Rowref, Columnref)
reduce_domain(Image, Rectangle, ImageReduced)
create_ncc_model(ImageReduced, 'auto', -3.14, 3.14, 'auto', 'use_polarity', ModelID)
create_shape_model(ImageReduced, 'auto', -3.14, 3.14, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID1)
for index:=2 to 20 by 1
    read_image (Image0, 'board/board-' + index$'02')
    find_ncc_model(Image0, ModelID, -3.14, 3.14, 0.1, 1, 0.5, 'true', 5, Row, Column, Angle, Score)
    vector_angle_to_rigid(Rowref, Columnref, 0, Row, Column, Angle, HomMat2D)
    affine_trans_region(Rectangle, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
    dev_set_color('blue')
    dev_display(RegionAffineTrans)
    find_shape_model(Image0, ModelID1, -3.14, 3.14, 0.1, 1, 0.5, 'least_squares', 0, 0.9, Row3, Column3, Angle3, Score3)
    vector_angle_to_rigid(Rowref, Columnref, 0, Row3, Column3, Angle3, HomMat2D)
    affine_trans_region(Rectangle, RegionAffineTrans3, HomMat2D, 'nearest_neighbor')
    dev_set_color('red')
    dev_display(RegionAffineTrans3)
endfor

你可能感兴趣的:(Halcon视觉库,QT,setCurrentIndex,curretIndex)