1. 参考案例

下面是halcon给出的有关卡尺的案例:

  • 案例:applly_metrology_model_diamond.hdev
  • 案例:apply_metrology_model.hdev

2. 使用卡尺进行测量的基本流程

2.1 创建卡尺模型

create_metrology_model( : : : MetrologyHandle)

2.2 设置图像宽高

set_metrology_model_image_size( : : MetrologyHandle, Width, Height : )//卡尺所在图像宽高

2.3 添加卡尺

* 直线卡尺
add_metrology_object_line_measure( : : MetrologyHandle, RowBegin, ColumnBegin, RowEnd, ColumnEnd, MeasureLength1, MeasureLength2, MeasureSigma, MeasureThreshold, GenParamName, GenParamValue : Index)
* 圆形卡尺
add_metrology_object_circle_measure( : : MetrologyHandle, Row, Column, Radius, MeasureLength1, MeasureLength2, MeasureSigma, MeasureThreshold, GenParamName, GenParamValue : Index)
* 椭圆形卡尺
add_metrology_object_ellipse_measure( : : MetrologyHandle, Row, Column, Phi, Radius1, Radius2, MeasureLength1, MeasureLength2, MeasureSigma, MeasureThreshold, GenParamName, GenParamValue : Index)
* 可旋转矩形卡尺
add_metrology_object_rectangle2_measure( : : MetrologyHandle, Row, Column, Phi, Length1, Length2, MeasureLength1, MeasureLength2, MeasureSigma, MeasureThreshold, GenParamName, GenParamValue : Index)
* 通用卡尺
add_metrology_object_generic( : : MetrologyHandle, Shape, ShapeParam, MeasureLength1, MeasureLength2, MeasureSigma, MeasureThreshold, GenParamName, GenParamValue : Index)

以直线卡尺为例的参数解释:
- MetrologyHandle:句柄
- RowBegin, ColumnBegin:直线起点行列坐标
- RowEnd, ColumnEnd:直线终点行列坐标
- MeasureLength1, MeasureLength2:测量矩形半宽、半高
- MeasureSigma:平滑系数
- MeasureThreshold:边缘幅度
- GenParamName:参数名
- GenParamValue:参数值
- Index:返回卡尺实例的索引
```

2.4 设置卡尺模板参数

set_metrology_model_param( : : MetrologyHandle, GenParamName, GenParamValue : )
* 设置参数可以选择标定参数:'camera_param',这样卡尺测量的结果就是世界坐标系,当然也可以先得到像素坐标,再转换成世界坐标,也是比较方便的。
* 设置参考系是非常常用的:'reference_system',这个参数是将被测物上的一个点设为参考点,它的结构式[row,column,angle] angle通常是0。

2.5 定位(变换)

align_metrology_model( : : MetrologyHandle, Row, Column, Angle : )//这里填参考点

2.6 测量

apply_metrology_model(Image : : MetrologyHandle : )

2.7 获得结果:




get_metrology_object_result( : : MetrologyHandle, Index, Instance, GenParamName, GenParamValue : Parameter)
get_metrology_object_result_contour( : Contour : MetrologyHandle, Index, Instance, Resolution : )
get_metrology_object_measures( : Contours : MetrologyHandle, Index, Transition : Row, Column)

3. 案例1:测量钻石的角度

在这里插入图片描述

halcon代码:

dev_update_window ('off')
dev_get_window (WindowHandle)
set_display_font (WindowHandle, 26, 'mono', 'true', 'false')
dev_set_line_width (3)

list_files ('.', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
read_image(Image, ImageFiles[0])
get_image_size(Image, Width, Height)
* 1.创建卡尺模型
create_metrology_model (MetrologyHandle)
* 2.设置图像宽高
set_metrology_model_image_size (MetrologyHandle, Width, Height)
* 3.添加卡尺
lineBeginR:=[155,155]
lineBeginC:=[400,400]
lineEndR:=[290,290]
lineEndC:=[230,570]
add_metrology_object_line_measure \
 (MetrologyHandle, lineBeginR, lineBeginC, lineEndR, lineEndC, \
  20, 5, 1, 30, [], [], Index1)

* 4.设置卡尺参数
gen_rectangle1 (ROI_0, 105.413, 328.421, 203.12, 482.063)
reduce_domain (Image, ROI_0, ImageReduced)
threshold (ImageReduced, Regions, 153, 255)
get_region_points (Regions, Rows, Columns)
set_metrology_model_param (MetrologyHandle, 'reference_system', [Rows[0],Columns[0],0])

for Index := 0 to |ImageFiles| - 1 by 1
       read_image (Image, ImageFiles[Index])      
       reduce_domain (Image, ROI_0, ImageReduced)
       threshold (ImageReduced, Regions, 153, 255)
       get_region_points (Regions, Rows, Columns)
       * 5.定位、变换
       align_metrology_model (MetrologyHandle, Rows[0], Columns[0], 0)
       * 6.测量
       apply_metrology_model (Image, MetrologyHandle)
       * 7.获得卡尺测量结果
       get_metrology_object_result (MetrologyHandle, 'all', 'all', 'result_type', 'all_param', LineParameter1)
       get_metrology_object_result_contour (Contour, MetrologyHandle, 'all', 'all', 1.5)
       get_metrology_object_measures (Contours, MetrologyHandle, 'all', 'all', Row, Column)
       
       * 8.显示
       * 计算夹角
       angle_ll (LineParameter1[0], LineParameter1[1], \
                 LineParameter1[2], LineParameter1[3], \
                 LineParameter1[4], LineParameter1[5], \
                 LineParameter1[6], LineParameter1[7], Angle)
       * 画出一个弧形    
       distance_pp (LineParameter1[0], LineParameter1[1], LineParameter1[2], LineParameter1[3], Distance)
       line_orientation (LineParameter1[0], LineParameter1[1], LineParameter1[2], LineParameter1[3], Phi)
       gen_circle_contour_xld (ContCircle, Rows[0], Columns[0], Distance/2, -Phi-Angle, -Phi, 'positive', 1)      
             
       dev_update_window ('on')
       dev_display (Image)
       dev_display (Contour)
       dev_display (Contours)      
       dev_display (ContCircle)
       disp_message (WindowHandle, 'Angle='+deg(Angle), 'image', 12, 12, 'black', 'true')
       stop()
endfor

4. 案例2:圆形卡尺和矩形卡尺

在这里插入图片描述

halcon代码:

dev_update_off ()
read_image (Image, 'pads')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')

RowCircle := [52:89:500]//间隔取点
CircleInitRow := [RowCircle,RowCircle]//合并了两个数组
CircleInitColumn := [gen_tuple_const(6,348),gen_tuple_const(6,438)]//创建数组的一种方法
gen_cross_contour_xld (Cross1, CircleInitRow, CircleInitColumn, 6, 0.785398)
CircleInitRadius := [gen_tuple_const(6,23),gen_tuple_const(6,23)]
CircleRadiusTolerance := 12

RectangleInitRow := [410,410]
RectangleInitColumn := [215,562]
RectangleInitPhi := [0,0]
RectangleInitLength1 := [85,85]
RectangleInitLength2 := [88,88]
RectangleTolerance := 10
* 
* 创建卡尺模型
create_metrology_model (MetrologyHandle)
* 设置卡尺模型图像宽高
set_metrology_model_image_size (MetrologyHandle, Width, Height)
* 添加矩形卡尺
add_metrology_object_rectangle2_measure (MetrologyHandle, RectangleInitRow, RectangleInitColumn, RectangleInitPhi, RectangleInitLength1, RectangleInitLength2, RectangleTolerance, 5, .5, 1, [], [], MetrologyRectangleIndices)
* 添加圆形卡尺
add_metrology_object_circle_measure (MetrologyHandle, CircleInitRow, CircleInitColumn, CircleInitRadius, CircleRadiusTolerance, 5, 1.5, 2, [], [], MetrologyCircleIndices)
* 设置卡尺参数
set_metrology_object_param (MetrologyHandle, MetrologyCircleIndices, 'num_instances', 2)
set_metrology_object_param (MetrologyHandle, MetrologyCircleIndices, 'measure_transition', 'uniform')
set_metrology_object_param (MetrologyHandle, MetrologyCircleIndices, 'min_score', .9)
* 测量
apply_metrology_model (Image, MetrologyHandle)
* 获得卡尺测量结果
get_metrology_object_result (MetrologyHandle, MetrologyRectangleIndices, 'all', 'result_type', 'all_param', RectangleParameter)

Sequence := [0:5:|RectangleParameter| - 1]
RectangleRow := RectangleParameter[Sequence]
RectangleColumn := RectangleParameter[Sequence + 1]
RectanglePhi := RectangleParameter[Sequence + 2]
RectangleLength1 := RectangleParameter[Sequence + 3]
RectangleLength2 := RectangleParameter[Sequence + 4]

get_metrology_object_result (MetrologyHandle, MetrologyCircleIndices, 'all', 'result_type', 'all_param', CircleParameter)
Sequence := [0:3:|CircleParameter| - 1]
CircleRow := CircleParameter[Sequence]
CircleColumn := CircleParameter[Sequence + 1]
CircleRadius := CircleParameter[Sequence + 2]
* 显示
get_metrology_object_result_contour (Contours, MetrologyHandle, 'all', 'all', 1.5)
get_metrology_object_measures (Contour, MetrologyHandle, 'all', 'all', Row1, Column1)
gen_cross_contour_xld (Cross, Row1, Column1, 6, 0.785398)
Color := ['gray','cyan','green']
dev_display (Image)
dev_set_line_width (1)
dev_set_color (Color[0])
dev_display (Contour)
dev_set_color (Color[1])
dev_display (Cross)
dev_set_line_width (2)
dev_set_color (Color[2])
dev_display (Contours)
Message := Color[2] + ': Measurement result'
Message[1] := Color[1] + ': Edge candidate points'
Message[2] := Color[0] + ': Measure regions'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')

5. 下载链接

以上代码和图片的下载链接:

链接:https://pan.baidu.com/s/1KAZSuEWHCX9ZeC9k1rgm1g
提取码:qc15

有对halcon感兴趣的小伙伴可以关注我,我们一起学习,一起进步。如果您觉得这篇文章对您有帮助的话,请帮我点赞哦!