【Halcon学习笔记】08.图像测量(2D)
1.概述
Halcon中的2D Metrology模块提供了亚像素级别的卡尺测量功能,可以测量的几何形状包括直线、圆、椭圆、矩形。
2D测量模型使用起来相对方便,如要测圆的半径,只要设置圆心坐标和模板半径,之后就能在模板半径内设置个测量范围,在测量范围内的边缘会被提取出来,从而自动测出圆的实际半径。

2. 相关概念
2.1 计量模型(metrology model)
包含所有计量对象、测量所需的所有信息以及测量结果的数据结构。
2.2 计量对象(metrology object)
用2D计量测量对象的数据结构。计量对象由特定的几何形状表示,形状参数大致为已知。此外,它包含控制测量的参数,例如指定测量区域的尺寸和分布的参数。
2.3 测量区域(measure regions)
排列垂直于近似对象边界的矩形区域。在这些区域中,提取用于获取计量对象精确形状参数的边缘。
3. 相关算子
3.1 创建
create_metrology_model(MetrologyHandle)
MetrologyHandle:测量模型句柄
3.2 添加
3.2.1添加直线测量对象到模型
add_metrology_object_line_measure()
MetrologyHandle:测量模型句柄
RowBegin:测量区域行坐标起点
ColumnBegin:测量区域列坐标起点
RowEnd:测量区域行坐标终点
ColumnEnd:测量区域列坐标终点
MeasureLength1:垂直于边界的测量区域的一半长度
MeasureLength2:相切于边界的测量区域的一半长度
MeasureSigma:用于平滑的高斯函数的 Sigma
MeasureThreshold:最小边缘幅度阈值
GenParamName:通用参数的名称
GenParamValue:通用参数值
Index:所创建的计量对象的索引

3.2.2 添加圆型测量对象到模型
add_metrology_object_circle_measure()
MetrologyHandle:测量模型句柄
Row:测量区域的圆心行坐标
Column:测量区域的圆行列坐标
Radius:测量区域的半径
MeasureLength1:垂直于边界的测量区域的一半长度
MeasureLength2:相切于边界的测量区域的一半长度
MeasureSigma:用于平滑的高斯函数的 Sigma
MeasureThreshold:最小边缘幅度阈值
GenParamName:通用参数的名称
GenParamValue:通用参数值
Index:所创建的计量对象的索引

3.2.3 添加椭圆测量对象到模型
add_metrology_object_ellipse_measure()
3.2.3 添加矩形测量对象到模型
add_metrology_object_rectangle2_measure()
3.3 设置
3.3.1 设置测量对象参数
set_metrology_object_param()
MetrologyHandle:测量模型句柄
Index:指定计量对象,为all时所有计量对象的参数都被设置('all')
GenParamName:通用参数的名称
'measure_length1':区域,垂直于边界的测量区域的一半长度
'measure_length2':区域,相切于边界的测量区域的一半长度
'measure_distance':区域,两个测量区域中心之间的距离
'num_measures':区域,测量区域数
'measure_sigma':测量,用于平滑的高斯函数的 Sigma
'measure_threshold':测量,最小边缘幅度阈值
'measure_select':测量,边缘端点的选择('last'、'first')
'measure_transition':测量,方向('all'、'negative'、 'positive')
'measure_interpolation':测量,插值类型
'min_score':拟合,最小分数
'num_instances':拟合,成功拟合实例的最大数量
'distance_threshold':拟合,距离阈值
GenParamValue:通用参数值
3.3.2 设置对整个计量模型有效的参数
set_metrology_model_param()
MetrologyHandle:测量模型句柄
GenParamName:通用参数的名称
'camera_param':是否使用相机内部参数
'plane_pose':是否相机三维姿态
'reference_system':根据图像坐标系的平移(行、列)和旋转角度(角度),定义一种新的参考系统
'scale':期望单位与原始单位的比率
GenParamValue:通用参数值
3.3.3 对齐测量模型位置(校准)
align_metrology_model()
MetrologyHandle:测量模型句柄
Row:对齐测量模型的行坐标
Column:对齐测量模型的列坐标
Angle:对齐测量模型的旋转角度
3.4 执行
apply_metrology_model()
Image:输入的测量图像
MetrologyHandle:测量模型句柄
3.5 获取
3.5.1 获取计量模型的计量对象的测量区域和边缘位置结果
get_metrology_object_measures()
Contours:测量区域的矩形 XLD 轮廓
MetrologyHandle:测量模型句柄
Index:指定计量对象,为all时所有计量对象的参数都被设置('all')
Transition:选择亮/暗或暗/亮边缘('all'、'negative'、 'positive')
Row:测量边缘的行坐标集
Column:测量边缘的列坐标集
3.5.2 获取计量模型的计量对象的结果轮廓
get_metrology_object_result_contour()
Contour:给定计量对象的结果轮廓。
MetrologyHandle:测量模型句柄
Index:指定计量对象,为all时所有计量对象的参数都被设置('all')
Instance:计量对象的实例('all')
Resolution:相邻轮廓点之间的距离
3.5.3 获取计量模型的计量对象的结果
get_metrology_object_result()
Contour:给定计量对象的结果轮廓。
MetrologyHandle:测量模型句柄
Index:指定计量对象,为all时所有计量对象的参数都被设置('all')
GenParamName:通常设置为’result_type’,表示用GenParamValue返回方式和结果
GenParamValue:通常设置为’all_param’,表示将所有测量参数到Parameter
Parameter:返回的参数值
对于直线:返回 [‘row_begin’,‘column_begin’,‘row_end’,‘column_end’]
对于圆型:返回[‘row’,‘column’,‘radius’]或 [‘x’,‘y’,‘radius’]
对于椭圆:返回[‘row’,‘column’,‘phi’,‘radius1’,‘radius2’]
对于矩形:返回[‘row’,‘column’,‘phi’,‘length1’,‘length2’]
3.6 释放
clear_metrology_model()
MetrologyHandle:测量模型句柄
4.模型测量在Halcon中的应用步骤
4.1 应用步骤

4.2 例程要求
测量矩形标签的像素长度。

4.3 实现步骤
1)找到模板图片的区域中心(跟随对齐用)
var_threshold (Image, Region, 100, 100, 0.5, 5, 'dark')
fill_up (Region, RegionFillUp)
connection (RegionFillUp, ConnectedRegions)
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)
smallest_rectangle2 (SelectedRegions, RowM, ColumnM, PhiM, Length1, Length2)
disp_cross (WindowHandle, RowM, ColumnM, 100, PhiM)

2)画出模板图片的测量区域
recR:=1830
recC:=2220
recA:=0
recL1:=960
recL2:=70
gen_rectangle2 (rec, recR, recC, rad(recA), recL1, recL2)

3)创建测量模型句柄
create_metrology_model (MetrologyHandle)
4)添加直线测量模型
add_metrology_object_line_measure (MetrologyHandle, recR, recC-recL1,recR, recC+recL1, recL1/4, recL2/2, 1, 20, [], [], Index)

5)设置测量对象参数
set_metrology_object_param (MetrologyHandle, 'all', 'measure_length1', 50)
set_metrology_object_param (MetrologyHandle, 'all', 'measure_length2', 10)
set_metrology_object_param (MetrologyHandle, 'all', 'measure_threshold', 20)
set_metrology_object_param (MetrologyHandle, 'all', 'measure_distance', 20)
set_metrology_object_param (MetrologyHandle, 'all', 'min_score',0.6)
set_metrology_object_param (MetrologyHandle, 'all', 'measure_sigma', 1)
set_metrology_object_param (MetrologyHandle, 'all', 'measure_transition', 'all')
set_metrology_object_param (MetrologyHandle, 'all', 'measure_select', 'all')
set_metrology_model_param (MetrologyHandle, 'reference_system', [RowM, ColumnM,PhiM])
6)找到运行图片的区域中心(跟随对齐用)
var_threshold (Image, Region, 100, 100, 0.5, 5, 'dark')
fill_up (Region, RegionFillUp)
connection (RegionFillUp, ConnectedRegions)
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)
smallest_rectangle2 (SelectedRegions, Row, Column, Phi, Length1, Length2)

7)跟随对齐测量模型
(理解:上面的测量卡尺已经创建好了,目前的问题在于将卡尺放在哪个位置。设置一个模板的跟随点,就是说模板图片卡尺在RowM, ColumnM的位置,现在同样找到测试图片的Row, Column的位置,就有对应关系可以对齐卡尺,原理同仿射变换)
align_metrology_model (MetrologyHandle, Row, Column,Phi)

8)执行测量
apply_metrology_model (Image, MetrologyHandle)
9)获取测量数据
get_metrology_object_result (MetrologyHandle, 'all', 'all', 'result_type', 'all_param', Parameter)
get_metrology_object_measures (Contours, MetrologyHandle, 'all', 'all', Row2, Column2)
get_metrology_object_result_contour (Contour1, MetrologyHandle, 'all', 'all', 1.5)
10)计算测量数据
distance_pp (Parameter[0], Parameter[1], Parameter[2], Parameter[3], Distance)
disp_message (WindowHandle, 'Lenght:'+Distance, 'window', 0, 10, 'green', 'false')

11)释放模型
clear_metrology_model (MetrologyHandle)

by Ryou2-