算子:

创建模板:create_aniso_shape_model

 

匹配模板:find_aniso_shape_model

 

例子:

测试用的图像:

halcon中CreateShapeModel参数说明 halcon创建模板_缩放

代码:

dev_set_draw ('margin')
read_image (Image, 'C:/Users/斌/Desktop/temp.png')
rgb1_to_gray (Image, GrayImage)
*选择感兴趣区域
draw_rectangle1 (3600, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
*选中目标模板
reduce_domain (GrayImage, Rectangle, ImageReduced)
threshold (ImageReduced, Regions, 0, 0)
connection (Regions, ConnectedRegions)
reduce_domain (Image, ConnectedRegions, ImageReduced1)
*创建一个形状的表示模型
create_aniso_shape_model (ImageReduced1, 'auto', rad(0), rad(90), 'auto', 0.9, 1.1, 'auto', 0.9, 1.1, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
*保存模板文件
* get_shape_model_contours (ModelContours, ModelID, 1)
*write_shape_model (ModelID, 'C:/Users/斌/Desktop/sss/xxx.shm')
dev_clear_window ()
dev_display (Image)
stop ()
***************************************************************
*开始匹配
read_image (Image, 'C:/Users/斌/Desktop/temp.png')
rgb1_to_gray (Image, GrayImage1)
*读取文件中的模板
*read_shape_model ('C:/Users/斌/Desktop/sss/xxx.shm', ModelID)
*模型匹配
dev_display (Image)
*参数说明:
*1、要匹配的图元 2、模型句柄 3、模型最小旋转角 4、模型最大旋转角 5、行方向的最小缩放比 6、行方向最大缩放比 7、列方向最小缩放比 8、列方向最大缩放比 9、找到模型的最小分数
*10、找到模型的数量 11、模型的最大重叠 12、亚像素精度 13、金字塔数 14、贪婪值 15、16找到的图像的中心坐标;17、18行列的缩放比 20、得分
find_aniso_shape_model (GrayImage1, ModelID, rad(0), rad(90), 0.9, 1.1, 0.9, 1.1, 0.99, 0, 0.5, 'least_squares', 4, 0.1, Row, Column, Angle, ScaleR, ScaleC, Score)
for Index := 0 to |Row|-1 by 1
    disp_cross (3600, Row[Index], Column[Index], 100,0)
    disp_message(3600, '得分:'+Score[Index], 'image', Row[Index], Column[Index], 'black', 'false')
endfor
*释放句柄
clear_shape_model (ModelID)

使用模板匹配需注意:匹配范围越大耗时越长,就好比大海捞针。可以缩小匹配范围来提升性能。

测试结果:

halcon中CreateShapeModel参数说明 halcon创建模板_缩放_02

算子介绍:

创建模板:create_aniso_shape_model:

参数

1、Template

(input_object) (multichannel-)image → object (byte / uint2)

Template(输入对象)(多通道)图像→数据结构:object(byte/uint2)

输入对象的域将用于建立模板

2、NumLevels

(input_control) integer → (integer / string)

NumLevels(输入参数,用于控制)

金字塔的层数

默认值:‘auto’

值的列表:‘auto’,0,1,2,3,4,5,6,7,8,9,10

3、AngleStart

(input_control) angle.rad → (real)

图像的最小的旋转角度

默认值:-0.39

建议值:-3.14, -1.57, -0.79, -0.39, -0.20, 0.0

 

 

 

4、AngleExtent

(input_control) angle.rad → (real)

旋转角度的范围

默认值:0.79

建议值:6.29, 3.14, 1.57, 0.79, 0.39

限制条件:AngleExtent >= 0

5、AngleStep

(input_control) angle.rad → (real / string) 旋转角度的步长(分辨率)。 默认值:'auto' 建议值:'auto',0.0175,0.0349,0.0524,0.0698,0.0873 限制:(AngleStep> = 0)&&(AngleStep <=(pi / 16))

6、ScaleRMin

(input_control) number → (real) 行方向的最小缩放率。 默认值:0.9 建议值:0.5,0.6,0.7,0.8,0.9,1.0 限制:ScaleRMin> 0

7、ScaleRMax

(input_control) number → (real)

行方向的最大缩放率。

默认值:1.1

建议值:1.0,1.1,1.2,1.3,1.4,1.5

限制:ScaleRMax> = ScaleRMin

8、ScaleRStep

(input_control) number → (real / string)

在行方向上缩放步长(分辨率)。

默认值:'auto'

建议值:'auto',0.01,0.02,0.05,0.1,0.15,0.2

限制:ScaleRStep> = 0

9、ScaleCMin

(input_control) number → (real) 列方向的最小缩放率。 默认值:0.9 建议值:0.5,0.6,0.7,0.8,0.9,1.0 限制:ScaleCMin> 010、ScaleCMax

(input_control) number → (real) 列方向的最大缩放率。 缺省值:1.1 建议值:1.0,1.1,1.2,1.3,1.4,1.5 限制:ScaleCMax> = ScaleCMin11、ScaleCStep

(input_control) number → (real / string) 在列方向上缩放步长(分辨率)。 默认值:'auto' 建议值:'auto',0.01,0.02,0.05,0.1,0.15,0.2 限制:ScaleCStep> = 012、Optimization

(input_control) string(-array) → (string) 优化的种类和用于生成模型的可选方法。 默认值:'auto' 值列表:'auto','none','point_reduction_low','point_reduction_medium','point_reduction_high','pregeneration','no_pregeneration'13、Metric

(input_control) string → (string) 匹配指标。

默认值:'use_polarity' 值列表:'use_polarity','ignore_global_polarity','ignore_local_polarity','ignore_color_polarity'14、Contrast

(input_control) number(-array) → (integer / string) 模板图像中对象的对比度的阈值或滞后阈值以及对象部分的可选最小大小。 默认值:'auto' 建议的值:'auto','auto_contrast','auto_contrast_hyst','auto_min_size',10,20,30,40,60,80,100,120,140,16015、MinContrast

(input_control) number → (integer / string) 搜索图像中物体的最小对比度。 默认值:'auto' 建议值:'auto',1,2,3,5,7,10,20,30,40 限制:MinContrast < Contrast16、ModelID

(output_control) shape_model → (integer) 模板句柄。

 

匹配模板:find_aniso_shape_model:

参数

1、Image

(input_object) (multichannel-)image → object (byte / uint2)

需要找到模型的图像。

2、ModelID

(input_control) shape_model → (integer)

模型的句柄。

3、AngleStart

(input_control) angle.rad → (real)

 

模型的最小旋转角度。

默认值:-0.39

建议值:-3.14,-1.57,-0.78,-0.39,-0.20,0.0

4、AngleExtent

(input_control) angle.rad → (real)

 

旋转角度的范围。

默认值:0.78

建议值:6.29,3.14,1.57,0.78,0.39,0.0

限制:AngleExtent> = 0

5、ScaleRMin

(input_control) number → (real)

 

模型在行方向上的最小缩放比例。

默认值:0.9

建议值:0.5,0.6,0.7,0.8,0.9,1.0

限制:ScaleRMin> 0

6、ScaleRMax

(input_control) number → (real)

 

模型在行方向上的最大缩放比例。

缺省值:1.1

建议值:1.0,1.1,1.2,1.3,1.4,1.5

限制:ScaleRMax> = ScaleRMin

7、ScaleCMin

(input_control) number → (real)

 

模型在列方向上的最小缩放比例。

默认值:0.9

建议值:0.5,0.6,0.7,0.8,0.9,1.0

限制:ScaleCMin> 0

8、ScaleCMax

(input_control) number → (real)

 

模型在列方向上的最大缩放比例。

缺省值:1.1

建议值:1.0,1.1,1.2,1.3,1.4,1.5

限制:ScaleCMax> = ScaleCMin

9、MinScore

(input_control) real → (real)

 

要找到的模型的实例的最小分数。

默认值:0.5

建议值:0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0

典型值范围:0≤MinScore≤1

最小增量:0.01

推荐增量:0.05

10、NumMatches

(input_control) integer → (integer)

 

要找到的模型的实例数。

默认值:1

建议值:0,1,2,3,4,5,10,20

11、MaxOverlap

(input_control) real → (real)

 

要找到的模型的实例的最大重叠。

默认值:0.5

建议值:0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0

典型值范围:0≤MaxOverlap≤1

最小增量:0.01

推荐增量:0.05

12、SubPixel

(input_control) string(-array) → (string)

亚像素精度。

默认值:'least_squares'

值列表:'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'

13、NumLevels

(input_control) integer(-array) → (integer)

 

匹配中使用的金字塔数量(如果| NumLevels | = 2,则使用最低金字塔级别)。

默认值:0

值列表:0,1,2,3,4,5,6,7,8,9,10

14、Greediness

(input_control) real → (real)

 

搜索模式的“贪婪”(0:安全但缓慢; 1:快速,但可能会错过匹配)。

默认值:0.9

建议值:0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0

典型值范围:0≤贪婪度≤1

最小增量:0.01

推荐增量:0.05

15、Row

(output_control) point.y-array → (real)

 

找到的模型的实例的行坐标。

16、Column

(output_control) point.x-array → (real)

找到的模型实例的列坐标。

17、Angle

(output_control) angle.rad-array → (real)

找到的模型的实例的旋转角度。

18、ScaleR

(output_control) number-array → (real)

在行方向上找到模型的实例的比例。

19、ScaleC

(output_control) number-array → (real)

在列方向上找到模型的实例的比例。

20、Score

(output_control) real-array → (real)

发现的模型实例的得分。

 

1、算子find_aniso_shape_model在输入图像Image(参数)中找到各向异性尺度不变形状模型ModelID(参数)的最佳NumMatches(参数)个实例。模型ModelID(参数)必须先通过调用create_aniso_shape_model或read_shape_model创建。

2、所得实例在行和列方向上的位置,旋转和缩放会以参数Row,Column,Angle,ScaleR和ScaleC的形式返回。

其中坐标Row和Column是搜索图像中形状模型原点的坐标。 默认情况下,原点是用于使用create_aniso_shape_model创建形状模型的图像的域(区域)的重心。

可以使用set_shape_model_origin设置不同的原点。

3、请注意,坐标Row和Column不完全对应于搜索图像中模型的位置。

因此,您不能直接使用它们。 相反,这些值可以进行优化后用于创建转换矩阵。

4、通过转换矩阵,我们可以使用匹配结果来完成各种任务。例如调整其他处理步骤的ROI。

5、每个找到的实例的得分都在Score中返回。

分数是介于0和1之间的数字,这是模型在图像中可见多少的近似度量。 例如,如果模型的一半被遮挡,则得分不能超过0.5。

6、图像Image(参数)的域确定了模型参考点的搜索空间。模型参考点是指在算子create_aniso_shape_model中用于创建形状模型的图像的域的重心。

不考虑使用set_shape_model_origin设置的不同原点。 在图像的域内搜索模型,模型必须完全位于图像内。

这意味着如果模型扩展超出图像边界,则该模型将不会被发现,即使它的分数大于MinScore(参数),这个行为可以通过set_system('border_shape_models','true')来改变,这可以使得超出图像边框的模型在得分大于MinScore时被发现。 在这里,位于图像之外的点被认为被遮挡,即,它们会降低得分。

应该注意的是,在这种模式下,搜索的运行时间会增加。

7、参数AngleStart和AngleExtent决定了搜索模型的旋转范围。

8、 ScaleRMin,ScaleRMax,ScaleCMin和ScaleCMax的参数决定了搜索模型的行和列方向的缩放范围。

9、如有必要,将两个范围缩小到使用create_aniso_shape_model创建模型时给出的范围。这意味着模型和搜索的角度范围必须真正重叠。

10、搜索中的角度范围不适用于模数360°。例如,如果使用AngleStart

= -20°和AngleExtent = 40°创建模型,使用AngleStart = 350°和AngleExtent = 20°搜索模型,则模型不会被发现。即使将他们视为模数360°时,角度范围将重叠,模型也是不会被发现。所以需要以AngleStart

= -10°和AngleExtent = 20°搜索模型。

11、如果模型ModelID是由算子create_shape_model或create_scaled_shape_model创建的,那将会以1.0的各向同性缩放或者在ScaleRMin到ScaleRMax范围内的各向同性缩放来搜索模型。

12、参数ScaleR和ScaleC返回实际的缩放率。

13、注意:某些稍微超出旋转和缩放范围的实例也有可能被识别出来。如果指定的搜索范围小于创建模型时给出的范围,则可能会发生这种情况。

14、参数MinScore确定了实例的最小匹配分数。选择较大的MinScore,搜索速度越快。如果模型可以预测到不会被遮挡,MinScore可能设置为高达0.8甚至0.9。如果匹配没有跟踪到最低金字塔级别,那么可能会发现比分低于MinScore的匹配。

15、可以使用NumMatches确定要查找的最大实例数。如果图像中找到的分数大于MinScore的NumMatches实例多,则只返回最佳的NumMatches个实例。如果少于NumMatches,则只返回能找到的实例,即参数MinScore优先于NumMatches。

16、如果模型呈现对称性,则可能发生在图像中发现具有类似位置但具有不同旋转的多个实例。参数MaxOverlap通过分数(即,0和1之间的数字)来确定两个实例可以最多重叠,以便将它们视为不同的实例,并且单独返回。如果两个实例彼此重叠超过MaxOverlap,则只返回最佳实例。重叠的计算基于所找到的实例的任意方向(见minimum_rectangle2)的最小包围矩形。如果MaxOverlap

= 0,发现的实例可能根本不重叠,而对于MaxOverlap = 1,所有实例都将返回。

17、参数SubPixel确定是否应以亚像素精度提取实例。如果SubPixel设置为“none”(或“false”用于向后兼容),则只能通过像素精度和使用create_aniso_shape_model指定的角度和比例分辨率来确定模型的姿态。如果SubPixel设置为“interpolation”(或“true”),则以亚像素精度确定位置以及旋转和缩放。在这种模式下,模型的姿态是通过得分函数进行插值得到的的。该模式几乎不需要计算时间,并达到了对于大多数应用来说足够高的精度。

18、然而,在一些应用中,精度要求非常高。在这些情况下,可以通过最小二乘法调整来确定模型的姿态。与“interpolation”相反,该模式需要额外的计算时间。可以使用不同的最小二乘法调整模式('least_squares','least_squares_high'和'least_squares_very_high')来确定正在搜索最小距离的准确性。然而,选择精度越高,子像素提取将采取越长的时间。通常,SubPixel应设置为“interpolation”。如果需要进行最小二乘法调整,则应选择“least_squares”,因为这将导致运行时和精度之间的最佳权衡。

19、相对于模型而言有稍微变形的物体,在某些情况下,无法被找到或者即使被找到,精度也很低。对于这样的对象,可以在参数SubPixel中额外传递最大允许对象变形。变形必须以像素为单位指定。这可以通过传递可选参数值“max_deformation”,后跟一个0到32之间的整数值(在同一个字符串中),该值指定最大变形。例如,如果对象的形状相对于存储在模型中的形状可以变形多达2个像素,则必须在SubPixel中传递值“max_deformation

2”。传递值“max_deformation 0”时,进行搜索时要求物体不能变形,与不设定“max_deformation”的作用一样。

20、请注意,最大变形值设定得较高时通常会导致运行时间增加。此外,选择变形值越高,发现错误模型实例的风险越高。这两个问题主要出现在搜索小物体或具有精细结构的物体时。这是因为这种物体在高变形时会失去其特征形状,而特征形状对于强大的搜索来说是很重要的。还要注意,对于较高的变形,如果在物体附近存在杂波,部分遮挡物体的精度可能会降低。因此,最大变形应尽可能选择尽可能小,只有在有必要的时候才设置得高一点。

21、当指定高于0的变形时,匹配分数的计算取决于亚像素提取的所选值即subpixel的值。在大多数情况,如果选择了“minimum_squares”,“minimum_squares_high”或“least_squares_very_high”(参考上文第17点),则匹配的分数会发生变化(与“none”或“interpolation”进行比较)。此外,如果选择最小二乘调整中的一个,则增加最大变形时得分可能增加,因为对于模型点,可以找到更多对应的图像点。

22、搜索期间使用的金字塔数量由NumLevels确定。如果需要,使用create_aniso_shape_model创建形状模型时的金字塔数量,如果NumLevels设置为0,则使用create_aniso_shape_model中指定的金字塔级别数。可选地,NumLevel可以包含第二个值,用于确定跟踪发现的匹配项的最低金字塔级别。因此,NumLevel的值[4,2]意味着匹配从第四个金字塔级别开始,并跟踪匹配到第二个最低金字塔级别(最低金字塔级别由值1表示)。该机制可用于减少匹配的运行时间。然而,应当注意,一般来说,在该模式中提取的姿态参数的准确度比在正常模式中更低,在正常模式中,匹配被跟踪到最低金字塔级。因此,如果需要高精度,则应将SubPixel设置为至少“'least_squares”。

23、如果使用的最低金字塔级别被选择得太大,可能会无法实现所需的精度,或者发现模型的错误实例,因为模型在较高的金字塔级别上不够具体,不能可靠地选择正确的模型实例。在这种情况下,要使用的最低金字塔级别必须设置为较小的值。

24、在质量差的输入图像中,即在例如散焦,变形或嘈杂的图像中,通常在最低金字塔级别上不能发现形状模型的实例。这种行为的原因是丢失或变形的边缘信息是由于图像质量差的结果。然而,边缘信息在更高的金字塔水平上可能是足够的。但是,如果使用在高级金字塔级别上发现的实例,请记住上述对准确性和鲁棒性的限制。合适的金字塔级别的选择,即可以在其上找到形状模型的至少一个实例的最低金字塔级别取决于模型和输入图像。这个金字塔级别可能因图像而异。为了便于对质量差的图像进行匹配,可以在匹配期间自动确定可以找到至少一个模型实例的最低金字塔级别。要激活此机制,必须在NumLevels中指定最低金字塔级别。如果例如NumLevels被设置为[4,-2],则匹配从第四金字塔级别开始并且跟踪到第二最低金字塔级别的匹配。这意味着在金字塔级别2上搜索形状模型的实例。如果在该金字塔级别上没有找到模型实例,则确定最低金字塔级别,可以在哪个模型的至少一个实例上找到。然后将返回此金字塔级别的实例。

25、参数Greediness决定了搜索的贪婪程度。如果Greediness

= 0,则使用安全搜索模式,如果模型在图像中可见,则始终会找到该模型。然而,在这种情况下,搜索将相对耗时。如果贪婪=

1,则使用不安全的搜索模式,即使在图像中可见,也可能导致在极少数情况下找不到该模型。对于贪婪= 1,实现最大搜索速度。

26、使用运算符set_shape_model_param可以为find_aniso_shape_model指定'timeout'。如果find_aniso_shape_model达到此“timeout”,则会终止搜索,并返回错误代码9400(H_ERR_TIMEOUT)。

27、根据ScaleRMin,ScaleRMax,ScaleCMin和ScaleCMax指定的缩放范围,如果形状模型未预先生成,则find_aniso_shape_model需要大量时间才能释放缓存的转换。由于在发生超时之后必须释放此转换,所以在这种情况下find_aniso_shape_model的运行时间超过了此时指定的“timeout”的值。