【Halcon初学者知识】模板形状匹配的主要算子

发布于:2022-12-21 ⋅ 阅读:(204) ⋅ 点赞:(0)

一、提要

        对于模板匹配,我们在文章【9】形状模板匹配已经讲述,但是其中有一个脉络需要强调。本文就是针对模板匹配的相关知识点进行详细展开,以加强对模板的理解。

二、坐标转换原理解析

上述例程中涉及到坐标的算子主要有:

  • create_shape_model
  • set_shape_model_origin
  • find_shape_model
  • vector_angle_to_rigid
  • affine_trans_contour_xld
  • affine_trans_region

三、算子详细解读

3.1 create_shape_model

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

1) Template输入参数

        操作符 create_shape_model 准备一个模板,在图像 Template 中传递,作为用于匹配的形状模型。

        模型使用多个图像金字塔层级生成并存储在内存中。如果选择模型的完整预生成(见下文),则在每个层级上多次旋转生成模型。输出参数 ModelID 是该模型的句柄,在随后的 find_shape_model 调用中使用。

 1)  NumLevels输入参数

        金字塔级别的数量由参数 NumLevels 确定。应该选择尽可能大,因为这样可以显着减少找到对象所需的时间。另一方面,必须选择 NumLevels 以便模型仍然可识别并且在最高金字塔级别上包含足够数量的点(至少四个)。这可以使用inspect_shape_model 的输出进行检查。如果没有生成足够的模型点,则在内部减少金字塔级别的数量,直到找到足够的模型点在最高金字塔级别。如果此过程会导致模型没有金字塔级别,即,如果模型点的数量在最低金字塔级别上已经太少,则 create_shape_model 返回错误消息。如果 NumLevels 设置为 ' auto'(或 0 表示向后兼容),create_shape_model 自动确定金字塔级别的数量。 get_shape_model_params。在极少数情况下,create_shape_model 确定的金字塔层数的值可能太大或太小。可能需要在 find_shape_model 中为 MinScore 或 Greediness 选择非常低的参数才能找到模型. 如果金字塔层数选择得太少,在 find_shape_model 中找到模型所需的时间可能会增加。应使用 inspect_shape_model 的输出选择金字塔层数。

3)旋转的定义( AngleStart 、 AngleExtent、 AngleStep)

        参数 AngleStart 和 AngleExtent 决定了模型在图像中可能出现的旋转范围。注意,模型只能通过 find_shape_model 在这个角度范围内找到。参数 AngleStep 决定了在所选范围内的步长因此,如果在 find_shape_model 中未指定亚像素精度,则此参数指定 find_shape_model 中角度可实现的精度。应根据对象的大小选择 AngleStep。较小的模型在模型中不具有许多不同的离散旋转图像,因此对于较小的模型,应选择较大的 AngleStep。如果 AngleExtent 不是 AngleStep 的整数倍,则相应地修改 AngleStep。为了确保对给定 AngleStart 的可能旋转范围的采样,可能的旋转范围rotations 修改如下:如果没有正整数值 n 使得 AngleStart 加上 n 倍 AngleStep 是精确的ly 0.0,AngleStart 最多减少 AngleStep,AngleExtent 增加 AngleStep。

        如果选择完整的模型预生成(见下文),则针对所选角度范围预生成模型并存储在内存中。存储模型所需的内存与角度步数和点数成正比因此,如果 AngleStep 太小或 AngleExtent 太大,则可能会发生模型不再适合(虚拟)内存的情况。这种情况下,要么必须放大 AngleStep,要么必须减小 AngleExtent。,它是希望模型完全适合主存,因为这样可以避免操作系统分页,因此找到对象的时间会小得多。由于可以通过 find_shape_model 使用亚像素分辨率确定角度,因此 AngleStep >= 1 可以为直径小于约 200 像素的模型选择。如果选择 AngleStep = 'auto'(或向后兼容为 0),create_shape_model 会根据模型。可以使用 get_shape_model_params 查询自动计算的角度步长。

        如果不选择模型的完整预生成,模型只在每个金字塔层级的参考位姿中创建,这种情况下,模型必须在运行时在 find_shape_model 中转换成不同的角度和尺度。模型的识别可能需要稍微多一点的时间。

4)优化(Optimization)

        因为生成的模板较多,如按照角度,将生成扇面系列。如果优化,就减少扇面模板数量,如果不优化,就保留全部。

        对于特别大的模型,通过将优化设置为与“无”不同的值来减少模型点的数量可能很有用。如果优化=“无”,则存储所有模型点。在所有其他情况下,点的数量如果点数减少,可能需要在 find_shape_model 中将参数 Greediness 设置为较小的值,例如 0.7 或 0.8。对于小型模型,模型点数的减少不会导致加速因为在这种情况下,通常必须检查更多潜在的模型实例。如果优化设置为“自动”,create_shape_model 会自动确定模型点数的减少。

 

        可选地,可以在优化中传递第二个值。该值确定模型是否完全预生成。为此,优化的第二个值必须设置为“pregeneration”或“no_pregeneration”。未使用(即,如果只传一个值),则使用 set_system('pregenerate_shape_models',...) 设置的模式。使用默认值 ('pregenerate_shape_models' = 'false'),模型不会完全预生成。完整的模型的预生成通常会导致运行时间稍低,因为模型不需要在运行时进行转换。但是,在这种情况下,内存需求和创建模型所需的时间明显更高。还需要注意的是,它不能期望这两种模式返回完全相同的结果,因为在运行时转换模型必然会导致转换后模型的内部数据与预生成转换后的模型不同例如,如果模型没有完全预生成,find_shape_model 通常会返回略低的分数,这可能需要为 MinScore 设置比完全预生成的模型略低的值。如果需要最大精度,则模型的位姿应由下式确定最小二乘调整。

        参数对比度决定了模型点必须具有的对比度。对比度是衡量对象与背景之间以及对象不同部分之间的局部灰度值差异的量度。对比度应选择为仅模板的显着特征对比度也可以包含一个有两个值的元组,这种情况下,使用类似于edges_image中使用的滞后阈值方法的方法对模型进行分割。这里,元组的第一个元素决定了下限阈值,而关于滞后阈值方法,请参阅 hysteresis_threshold。可选地,对比度可以包含第三个值作为元组的最后一个元素。该值确定基于组件大小选择重要模型组件的阈值,即具有较少点的组件比如此指定的最小尺寸被抑制。对于每个连续的金字塔级别,最小尺寸的阈值除以 2。如果应抑制小模型组件,但不应执行滞后阈值处理,但必须在对比度中指定三个值。在这种情况下,前两个值​​可以简单地设置为相同的值。这个参数的效果可以提前用inspect_shape_model检查。如果Contrast设置为'auto',create_shape_model自动确定上述三个值。或者,只有对比度(' auto_contrast'),迟滞阈值('auto_contrast_hyst'),或者最小尺寸('auto_min_size')可以自动确定。其余没有自动确定的值可以另外以元组的形式传递。,[ 'auto_contrast','auto_min_size'] 被传递,对比度和最小尺寸都是自动确定的。最小尺寸是自动确定的,而滞后阈值设置为 20 和 30 等。在某些情况下,可能会发生对比度阈值的自动确定不令人满意。由于特定于应用程序,应包含或抑制某些模型组件原因或对象是否包含几种不同的对比。

        使用MinContrast,可以确定模型在find_shape_model进行识别时至少必须有哪个对比度,也就是说这个参数将模型和图像中的噪声分开,所以灰度值变化的范围是一个不错的选择例如,如果灰度值在10个灰度的范围内波动,则MinContrast应设置为10。如果模型和搜索图像使用多通道图像,并且参数Metric设置为'ignore_color_polarity' (见下)一个通道中的噪声必须乘以通道数的平方根才能确定MinContrast。例如,如果灰度值在单个通道的10个灰度级范围内波动,图像是三通道图像MinContrast应该设置为17。显然MinContrast必须小于Contrast。如果模型即使被严重遮挡也能被识别,MinContrast 应略大于噪声造成的灰度值波动范围,以保证 find_shape_model 能够稳健准确地提取模型的位置和旋转。设置为“auto”,则根据模型图像中的噪声自动确定最小对比度。因此,只有在识别过程中的图像噪声与模型图像中的噪声相似时,自动确定才有意义。此外,在某些情况下在这种情况下,建议增加自动确定的值以增加对遮挡的鲁棒性(见上文)。

        参数 Metric 决定了模型在图像中被识别的条件。如果 Metric = 'use_polarity',则图像中的物体和模型必须具有相同的对比度。例如,如果模型是一个明亮的物体深色背景,只有当它比背景更亮时才会找到对象。如果 Metric = 'ignore_global_polarity',如果对比度全局反转,也会在图像中找到对象。它比背景暗。find_shape_model 的运行时将在这种情况下略有增加。如果 Metric = 'ignore_local_polarity',即使局部对比度发生变化,也能找到模型。例如,如果对象由具有中等灰度值的部分组成,在该部分中较暗或较暗或较亮的子对象位于。由于在这种情况下 find_shape_model 的运行时间显着增加,通常最好创建几个反映可能对比度的模型使用 create_shape_model 来匹配对象的变体,并同时使用 find_shape_models 进行匹配。以上三个指标只能应用于单通道图像。如果使用多通道图像作为模型图像或搜索图像,则只有第一个通道将是已使用(并且不会返回错误消息)。如果 Metric = 'ignore_color_polarity',即使颜色对比度在局部发生变化,也会找到模型。例如,如果对象的某些部分可以改变它们的颜色,例如,从红色到绿色。特别是,如果事先不知道对象在哪些通道中可见,则此模式很有用。在此模式下,find_shape_model 的运行时间也可以显着增加。度量 'ignore_color_polarity' 可用于图像具有任意数量的通道。如果用于单通道图像,则与“ignore_local_polarity”具有相同的效果。需要注意的是,对于 Metric = 'ignore_color_polarity',模型中的通道数使用 create_shape_model 创建和使用 find_shape_model 进行搜索可能不同。例如,这可以用于从合成生成的单通道图像创建模型。光的细分(如在 RGB 图像中)。通道可以,例如,还包含通过从不同方向照射对象而获得的同一对象的图像。

        模型图像模板的域(区域)的重心用作模型的原点(参考点)。

3.2 find_shape_model(Image : : ModelID, ... ... )

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

  1. reduce_domain(Image, ROI_0, ImageReduced)


dev_set_line_width(4)
list_image_files('images', 'default', [], ImageFiles)
read_image(Image, 'images/rote_all')
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_display(Image)

gen_rectangle1 (ROI_0, 182.5, 364.5, 268.5, 444.5)
reduce_domain(Image, ROI_0, ImageReduced)
create_shape_model (ImageReduced, 'auto', 0, 6.28, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
for Index:=0 to |ImageFiles|-1 by 1
    read_image(Image,ImageFiles[Index])
    dev_display(Image)
    find_shape_model (Image, ModelID, 0, 6.28, 0.5, 13, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
    dev_display_shape_matching_results (ModelID, 'red', Row, Column, Angle, 1, 1, 0)
    stop()
endfor

注意:上面典型的算子是 create_shape_model (),find_shape_model (), dev_display_shape_matching_results()三个算子,请查看它们的halp解释。


网站公告

今日签到

点亮在社区的每一天
去签到