halcon之测量和拟合

h a l c o n 之测量和拟合 halcon之测量和拟合 halcon之测量和拟合

分割轮廓:
合并轮廓: union_adjacent_contours_xld (Edges, UnionContours, 7, 7, ‘attr_keep’)
平滑轮廓:smooth_contours_xld (SelectedXLD_black_eye, SmoothedContours, 15)


测量流程图
1.采集图像(实时或者外触发)
2.图像预处理去噪声(采用滤波器)
3.图像分割(将目标和背景分割)
4.区域定位(在该区域内进行测量)
5.边缘提取(像素或者亚像素)
6.进行直线或者曲线拟合(用于求解距离)
7.求解拟合直线或者曲线间的像素距离(欧式距离,棋盘距离等)
8.像素距离到实际距离的转换(根据之前的标定结果)
9.测量结果显示


由暗到亮:正边缘
由亮到暗:负边缘


拟合流程
1.采集图像
2.图像预处理
3.边缘轮廓提取
4.轮廓分割或合并
5.根据轮廓进行拟合


边缘幅度,就是对原图像求一阶导数


核心算子

在这里插入图片描述

gen_measure_rectangle2 (Row, Column, Angle, Length1, Length2, Width, Height, 'bilinear', MeasureHandle)

重要参数

  1. Length1:半宽
  2. Length2:半高
  3. Width:测量图像的宽
  4. Height:测量图像的高
Parameters

Row (input_control)  rectangle2.center.y → (real / integer)
Row coordinate of the center of the rectangle.
Default value: 300.0
Suggested values: 10.0, 20.0, 50.0, 100.0, 200.0, 300.0, 400.0, 500.0
Typical range of values: 0.0 ≤ Row ≤ 511.0 (lin)
Minimum increment: 1.0
Recommended increment: 10.0


Column (input_control)  rectangle2.center.x → (real / integer)
Column coordinate of the center of the rectangle.
Default value: 200.0
Suggested values: 10.0, 20.0, 50.0, 100.0, 200.0, 300.0, 400.0, 500.0
Typical range of values: 0.0 ≤ Column ≤ 511.0 (lin)
Minimum increment: 1.0
Recommended increment: 10.0

Phi (input_control)  rectangle2.angle.rad → (real / integer)
Angle of longitudinal axis of the rectangle to horizontal (radians).
Default value: 0.0
Suggested values: -1.178097, -0.785398, -0.392699, 0.0, 0.392699, 0.785398, 1.178097
Typical range of values: -1.178097 ≤ Phi ≤ 1.178097 (lin)
Minimum increment: 0.001
Recommended increment: 0.1
Restriction: - pi < Phi && Phi <= pi

Length1 (input_control)  rectangle2.hwidth → (real / integer)
Half width of the rectangle.
Default value: 100.0
Suggested values: 3.0, 5.0, 10.0, 15.0, 20.0, 50.0, 100.0, 200.0, 300.0, 500.0
Typical range of values: 1.0 ≤ Length1 ≤ 511.0 (lin)
Minimum increment: 1.0
Recommended increment: 10.0
Restriction: Length1 >= 1.0

Length2 (input_control)  rectangle2.hheight → (real / integer)
Half height of the rectangle.
Default value: 20.0
Suggested values: 1.0, 2.0, 3.0, 5.0, 10.0, 15.0, 20.0, 50.0, 100.0, 200.0
Typical range of values: 0.0 ≤ Length2 ≤ 511.0 (lin)
Minimum increment: 1.0
Recommended increment: 10.0
Restriction: Length2 >= 0.0


Width (input_control)  extent.x → (integer)
Width of the image to be processed subsequently.
Default value: 512
Suggested values: 128, 160, 192, 256, 320, 384, 512, 640, 768
Typical range of values: 0 ≤ Width ≤ 1024 (lin)
Minimum increment: 1
Recommended increment: 16


Height (input_control)  extent.y → (integer)
Height of the image to be processed subsequently.
Default value: 512
Suggested values: 120, 128, 144, 240, 256, 288, 480, 512, 576
Typical range of values: 0 ≤ Height ≤ 1024 (lin)
Minimum increment: 1
Recommended increment: 16


Interpolation (input_control)  string → (string)
Type of interpolation to be used.
Default value: 'nearest_neighbor'
List of values: 'bicubic', 'bilinear', 'nearest_neighbor'


MeasureHandle (output_control)  measure_id → (integer)
Measure object handle.

measure_pairs (Fuse, MeasureHandle, 1, 1, 'negative', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
  1. Sigma:平滑参数
  2. Threshold:最小边缘振幅
  3. Transition:找的正边缘还是负边缘(第一个边缘)
  4. Select :选第一条边,还是最后一条,还是所有的边
  5. RowEdgeFirst:边缘对中的第一个边缘的行坐标
  6. ColumnEdgeFirst:边缘对中第一个边缘的列坐标
  7. AmplitudeFirst:边缘对中第一个边缘的幅度值(就是一阶导数)
  8. RowEdgeSecond:边缘对中的第二个边缘的行坐标
  9. ColumnEdgeSecond:边缘对中第二个边缘的列坐标
  10. AmplitudeSecond:边缘对中第二个边缘的幅度值(就是一阶导数)
  11. IntraDistance :边缘对中左右边缘之间的距离
  12. InterDistance:相邻两个边缘对中心的的距离
measure_pairs(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
Parameters

Image (input_object)  singlechannelimage → object (byte / uint2 / real)
Input image.

MeasureHandle (input_control)  measure_id → (integer)
Measure object handle.

Sigma (input_control)  number → (real)
Sigma of gaussian smoothing.
Default value: 1.0
Suggested values: 0.4, 0.6, 0.8, 1.0, 1.5, 2.0, 3.0, 4.0, 5.0, 7.0, 10.0
Typical range of values: 0.4 ≤ Sigma ≤ 100 (lin)
Minimum increment: 0.01
Recommended increment: 0.1
Restriction: Sigma >= 0.4

Threshold (input_control)  number → (real)
Minimum edge amplitude.
Default value: 30.0
Suggested values: 5.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 90.0, 110.0
Typical range of values: 1 ≤ Threshold ≤ 255 (lin)
Minimum increment: 0.5
Recommended increment: 2

Transition (input_control)  string → (string)
Type of gray value transition that determines how edges are grouped to edge pairs.
Default value: 'all'
List of values: 'all', 'all_strongest', 'negative', 'negative_strongest', 'positive', 'positive_strongest'

Select (input_control)  string → (string)
Selection of edge pairs.
Default value: 'all'
List of values: 'all', 'first', 'last'

RowEdgeFirst (output_control)  point.y-array → (real)
Row coordinate of the center of the first edge.

ColumnEdgeFirst (output_control)  point.x-array → (real)
Column coordinate of the center of the first edge.

AmplitudeFirst (output_control)  real-array → (real)
Edge amplitude of the first edge (with sign).

RowEdgeSecond (output_control)  point.y-array → (real)
Row coordinate of the center of the second edge.

ColumnEdgeSecond (output_control)  point.x-array → (real)
Column coordinate of the center of the second edge.

AmplitudeSecond (output_control)  real-array → (real)
Edge amplitude of the second edge (with sign).

IntraDistance (output_control)  real-array → (real)
Distance between edges of an edge pair.

InterDistance (output_control)  real-array → (real)
Distance between consecutive edge pairs.

measure_pos

measure_pos (Fuse, MeasureHandle, 1, 30, 'all', 'all', RowEdge, ColumnEdge, Amplitude, Distance)
measure_pos(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdge, ColumnEdge, Amplitude, Distance)
  1. Distance:相邻边的距离
Parameters:
Image (input_object)  singlechannelimage → object (byte / uint2 / real)
Input image.

MeasureHandle (input_control)  measure_id → (integer)
Measure object handle.

Sigma (input_control)  number → (real)
Sigma of gaussian smoothing.
Default value: 1.0
Suggested values: 0.4, 0.6, 0.8, 1.0, 1.5, 2.0, 3.0, 4.0, 5.0, 7.0, 10.0
Typical range of values: 0.4 ≤ Sigma ≤ 100 (lin)
Minimum increment: 0.01
Recommended increment: 0.1
Restriction: Sigma >= 0.4

Threshold (input_control)  number → (real)
Minimum edge amplitude.
Default value: 30.0
Suggested values: 5.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 90.0, 110.0
Typical range of values: 1 ≤ Threshold ≤ 255 (lin)
Minimum increment: 0.5
Recommended increment: 2

Transition (input_control)  string → (string)
Light/dark or dark/light edge.
Default value: 'all'
List of values: 'all', 'negative', 'positive'

Select (input_control)  string → (string)
Selection of end points.
Default value: 'all'
List of values: 'all', 'first', 'last'

RowEdge (output_control)  point.y-array → (real)
Row coordinate of the center of the edge.

ColumnEdge (output_control)  point.x-array → (real)
Column coordinate of the center of the edge.

Amplitude (output_control)  real-array → (real)
Edge amplitude of the edge (with sign).

Distance (output_control)  real-array → (real)
Distance between consecutive edges.

一维测量 一维测量 一维测量

示例1:

1.gen_measure_rectangle2 (Row, Column, Angle, Length1, Length2, Width, Height, 'bilinear', MeasureHandle)

2.measure_pairs (Fuse, MeasureHandle, 1, 1, 'negative', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)

3.close_measure (MeasureHandle)

示例1: 测量宽度

* 窗口设置
dev_update_window ('off')
dev_close_window ()
* 读取图像
read_image (Fuse, 'fuse')
* 获取图像大小
get_image_size (Fuse, Width, Height)
* 图像显示设置
dev_open_window_fit_image (Fuse, 0, 0, Width, Height, WindowID)
set_display_font (WindowID, 12, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (3)
dev_display (Fuse)
set_display_font (WindowID, 12, 'mono', 'true', 'false')
disp_continue_message (WindowID, 'black', 'true')
stop ()
* 创建测量矩形句柄
Row := 297
Column := 545
Length1 := 80
Length2 := 10
Angle := rad(90)
* 生成矩形
gen_rectangle2 (ROI, Row, Column, Angle, Length1, Length2)
* 生成测量矩形
gen_measure_rectangle2 (Row, Column, Angle, Length1, Length2, Width, Height, 'bilinear', MeasureHandle)
* 显示ROI
dev_display (ROI)
disp_continue_message (WindowID, 'black', 'true')
stop ()
* 测量边缘对
measure_pairs (Fuse, MeasureHandle, 1, 1, 'negative', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
disp_continue_message (WindowID, 'black', 'true')
disp_line (WindowID, RowEdgeFirst, ColumnEdgeFirst, RowEdgeSecond, ColumnEdgeSecond)
stop ()
* 可视化结果
for i := 0 to |RowEdgeFirst| - 1 by 1
    * 生成多边形
    gen_contour_polygon_xld (EdgeFirst, [-sin(Angle + rad(90)) * Length2 + RowEdgeFirst[i],-sin(Angle - rad(90)) * Length2 + RowEdgeFirst[i]], [cos(Angle + rad(90)) * Length2 + ColumnEdgeFirst[i],cos(Angle - rad(90)) * Length2 + ColumnEdgeFirst[i]])
    * 生成多边形
    gen_contour_polygon_xld (EdgeSecond, [-sin(Angle + rad(90)) * Length2 + RowEdgeSecond[i],-sin(Angle - rad(90)) * Length2 + RowEdgeSecond[i]], [cos(Angle + rad(90)) * Length2 + ColumnEdgeSecond[i],cos(Angle - rad(90)) * Length2 + ColumnEdgeSecond[i]])
    * 显示
    dev_set_color ('cyan')
    dev_display (EdgeFirst)
    dev_set_color ('magenta')
    dev_display (EdgeSecond)
    dev_set_color ('blue')
    * 设置显示位置
    if (i == 0)
        set_tposition (WindowID, RowEdgeFirst[i] + 5, ColumnEdgeFirst[i] + 20)
    else
        set_tposition (WindowID, RowEdgeFirst[i] - 40, ColumnEdgeFirst[i] + 20)
    endif
    * 显示文本
    write_string (WindowID, 'width: ' + IntraDistance[i] + ' pix')
endfor
disp_continue_message (WindowID, 'black', 'true')
stop ()
* ****
*  注销句柄
* ****
close_measure (MeasureHandle)
dev_update_window ('on')
dev_clear_window ()

在这里插入图片描述

测量助手的使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

read_image (Fuse, 'fuse')
* Measure 01: Code generated by Measure 01
* Measure 01: Prepare measurement
AmplitudeThreshold := 54
RoiWidthLen2 := 21
set_system ('int_zooming', 'false')
* Measure 01: Coordinates for line Measure 01 [0]
LineRowStart_Measure_01_0 := 205
LineColumnStart_Measure_01_0 := 546
LineRowEnd_Measure_01_0 := 374
LineColumnEnd_Measure_01_0 := 546
* Measure 01: Convert coordinates to rectangle2 type
TmpCtrl_Row := 0.5*(LineRowStart_Measure_01_0+LineRowEnd_Measure_01_0)
TmpCtrl_Column := 0.5*(LineColumnStart_Measure_01_0+LineColumnEnd_Measure_01_0)
TmpCtrl_Dr := LineRowStart_Measure_01_0-LineRowEnd_Measure_01_0
TmpCtrl_Dc := LineColumnEnd_Measure_01_0-LineColumnStart_Measure_01_0
TmpCtrl_Phi := atan2(TmpCtrl_Dr, TmpCtrl_Dc)
TmpCtrl_Len1 := 0.5*sqrt(TmpCtrl_Dr*TmpCtrl_Dr + TmpCtrl_Dc*TmpCtrl_Dc)
TmpCtrl_Len2 := RoiWidthLen2
* Measure 01: Create measure for line Measure 01 [0]
* Measure 01: Attention: This assumes all images have the same size!
gen_measure_rectangle2 (TmpCtrl_Row, TmpCtrl_Column, TmpCtrl_Phi, TmpCtrl_Len1, TmpCtrl_Len2, 768, 576, 'nearest_neighbor', MsrHandle_Measure_01_0)
* Measure 01: ***************************************************************
* Measure 01: * The code which follows is to be executed once / measurement *
* Measure 01: ***************************************************************
* Measure 01: The image is assumed to be made available in the
* Measure 01: variable last displayed in the graphics window
copy_obj (Fuse, Image, 1, 1)
* Measure 01: Execute measurements
measure_pairs (Image, MsrHandle_Measure_01_0, 6, AmplitudeThreshold, 'negative', 'all', Row1_Measure_01_0, Column1_Measure_01_0, Amplitude1_Measure_01_0, Row2_Measure_01_0, Column2_Measure_01_0, Amplitude2_Measure_01_0, Width_Measure_01_0, Distance_Measure_01_0)
* Measure 01: Do something with the results
* Measure 01: Clear measure when done
close_measure (MsrHandle_Measure_01_0)

在这里插入图片描述

示例2:

* 设置窗口
dev_close_window ()
* 读取图片
read_image (Image, 'ic_pin')
* 获取图像大小
get_image_size (Image, Width, Height)
* 设置窗口显示
dev_open_window (0, 0, Width / 2, Height / 2, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_display (Image)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* draw_rectangle2 (WindowHandle, Row, Column, Phi, Length1, Length2)
* 生成测量矩形
Row := 47
Column := 485
Phi := 0
Length1 := 420
Length2 := 10
dev_set_color ('green')
dev_set_draw ('margin')
dev_set_line_width (3)
* 生成显示矩形
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
* 生成测量矩形
gen_measure_rectangle2 (Row, Column, Phi, Length1, Length2, Width, Height, 'nearest_neighbor', MeasureHandle)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_update_pc ('off')
dev_update_var ('off')
* 设置循环次数
n := 100
* 计算时间
count_seconds (Seconds1)
* 遍历
for i := 1 to n by 1
    * 测量边缘对
    measure_pairs (Image, MeasureHandle, 1.5, 30, 'negative', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, PinWidth, PinDistance)
endfor
* 计算时间
count_seconds (Seconds2)
* 耗时
Time := Seconds2 - Seconds1
* 文本信息显示设置
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_set_color ('red')
* 显示结果
disp_line (WindowHandle, RowEdgeFirst, ColumnEdgeFirst, RowEdgeSecond, ColumnEdgeSecond)
avgPinWidth := sum(PinWidth) / |PinWidth|
avgPinDistance := sum(PinDistance) / |PinDistance|
numPins := |PinWidth|
dev_set_color ('yellow')
disp_message (WindowHandle, 'Number of pins: ' + numPins, 'image', 200, 100, 'yellow', 'false')
disp_message (WindowHandle, 'Average Pin Width:  ' + avgPinWidth, 'image', 260, 100, 'yellow', 'false')
disp_message (WindowHandle, 'Average Pin Distance:  ' + avgPinDistance, 'image', 320, 100, 'yellow', 'false')
* dump_window (WindowHandle, 'tiff_rgb', 'C:\\Temp\\pins_result')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
* 显示矩形
Row1 := 0
Column1 := 600
Row2 := 100
Column2 := 700
dev_set_color ('blue')
disp_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
stop ()
* 显示图像
dev_set_part (Row1, Column1, Row2, Column2)
dev_display (Image)
dev_set_color ('green')
dev_display (Rectangle)
dev_set_color ('red')
disp_line (WindowHandle, RowEdgeFirst, ColumnEdgeFirst, RowEdgeSecond, ColumnEdgeSecond)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
close_measure (MeasureHandle)
dev_set_part (0, 0, Height - 1, Width - 1)
dev_display (Image)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_set_color ('green')
* draw_rectangle2 (WindowHandle, Row, Column, Phi, Length1, Length2)
* 生成测量矩形
Row := 508
Column := 200
Phi := -1.5708
Length1 := 482
Length2 := 35
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
gen_measure_rectangle2 (Row, Column, Phi, Length1, Length2, Width, Height, 'nearest_neighbor', MeasureHandle)
stop ()
* 测量边缘点
measure_pos (Image, MeasureHandle, 1.5, 30, 'all', 'all', RowEdge, ColumnEdge, Amplitude, Distance)
* 显示测量结果
PinHeight1 := RowEdge[1] - RowEdge[0]
PinHeight2 := RowEdge[3] - RowEdge[2]
dev_set_color ('red')
disp_line (WindowHandle, RowEdge, ColumnEdge - Length2, RowEdge, ColumnEdge + Length2)
disp_message (WindowHandle, 'Pin Height:  ' + PinHeight1, 'image', RowEdge[1] + 40, ColumnEdge[1] + 100, 'yellow', 'false')
disp_message (WindowHandle, 'Pin Height:  ' + PinHeight2, 'image', RowEdge[3] - 120, ColumnEdge[3] + 100, 'yellow', 'false')
* dump_window (WindowHandle, 'tiff_rgb', 'C:\\Temp\\pins_height_result')
* 注销测量句柄
close_measure (MeasureHandle)
dev_set_draw ('fill')
dev_set_line_width (1)


在这里插入图片描述

示例3:

* 窗口设置
dev_update_pc ('off')
dev_update_window ('off')
dev_update_var ('off')
* 读取图像
open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, 'default', 'board/board.seq', 'default', -1, 1, FGHandle)
grab_image (Image, FGHandle)
* 获取图像大小
get_image_size (Image, Width, Height)
* 设置窗口显示
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_open_window (Height + 70, 0, Width, 120, 'black', WindowHandleText)
dev_set_window (WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
set_display_font (WindowHandleText, 16, 'mono', 'true', 'false')
dev_set_color ('red')
dev_display (Image)
* 生成矩形
Row1 := 188
Column1 := 182
Row2 := 298
Column2 := 412
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
* 获取旋转中心
area_center (Rectangle, Area, Row, Column)
* 定义矩形参数
Rect1Row := -102
Rect1Col := 5
Rect2Row := 107
Rect2Col := 5
RectPhi := 0
RectLength1 := 170
RectLength2 := 5
* 生成矩形
gen_rectangle2 (Rectangle1, Row + Rect1Row, Column + Rect1Col, RectPhi, RectLength1, RectLength2)
* 生成矩形
gen_rectangle2 (Rectangle2, Row + Rect2Row, Column + Rect2Col, RectPhi, RectLength1, RectLength2)
* 获取区域图像
reduce_domain (Image, Rectangle, ImageReduced)
* 创建模板
create_shape_model (ImageReduced, 4, 0, rad(360), rad(1), 'none', 'use_polarity', 30, 10, ModelID)
* 获取模板
get_shape_model_contours (ShapeModel, ModelID, 1)
* 生成仿射矩阵
hom_mat2d_identity (HomMat2DIdentity)
* 创建仿射变换矩阵
hom_mat2d_translate (HomMat2DIdentity, Row, Column, HomMat2DTranslate)
* 对轮廓进行仿射变换
affine_trans_contour_xld (ShapeModel, ShapeModelTrans, HomMat2DTranslate)
* 显示图像结果信息
dev_display (Image)
dev_set_color ('green')
dev_display (ShapeModelTrans)
dev_set_color ('blue')
dev_set_draw ('margin')
dev_set_line_width (3)
dev_display (Rectangle1)
dev_display (Rectangle2)
dev_set_draw ('fill')
dev_set_line_width (1)
dev_set_color ('yellow')
disp_message (WindowHandle, ['Press left button to start','and stop the demo'], 'window', 12, 12, 'black', 'true')
* 等待鼠标点击
get_mbutton (WindowHandle, Row3, Column3, Button1)
wait_seconds (0.5)
Button := 0
* 如果Button不等于1
while (Button != 1)
    dev_set_window (WindowHandle)
    dev_set_part (0, 0, Height - 1, Width - 1)
    * 获取图像
    grab_image (ImageCheck, FGHandle)
    dev_display (ImageCheck)
    count_seconds (S1)
    * 查找模板
    find_shape_model (ImageCheck, ModelID, 0, rad(360), 0.7, 1, 0.5, 'least_squares', 4, 0.7, RowCheck, ColumnCheck, AngleCheck, Score)
    count_seconds (S2)
    dev_display (ImageCheck)
    * 如果分数绝对值大于0
    if (|Score| > 0)
        dev_set_color ('green')
        * 生成仿射矩阵
        hom_mat2d_identity (HomMat2DIdentity)
        * xy变化
        hom_mat2d_translate (HomMat2DIdentity, RowCheck, ColumnCheck, HomMat2DTranslate)
        * 角度变化
        hom_mat2d_rotate (HomMat2DTranslate, AngleCheck, RowCheck, ColumnCheck, HomMat2DRotate)
        * 对轮廓进行仿射变换
        affine_trans_contour_xld (ShapeModel, ShapeModelTrans, HomMat2DRotate)
        dev_display (ShapeModelTrans)
        * 进行像素级仿射变换
        affine_trans_pixel (HomMat2DRotate, Rect1Row, Rect1Col, Rect1RowCheck, Rect1ColCheck)
        * 进行像素级仿射变换
        affine_trans_pixel (HomMat2DRotate, Rect2Row, Rect2Col, Rect2RowCheck, Rect2ColCheck)
        * 生成矩形
        gen_rectangle2 (Rectangle1Check, Rect1RowCheck, Rect1ColCheck, AngleCheck, RectLength1, RectLength2)
        * 生成矩形
        gen_rectangle2 (Rectangle2Check, Rect2RowCheck, Rect2ColCheck, AngleCheck, RectLength1, RectLength2)
        * 设置显示
        dev_set_color ('blue')
        dev_set_draw ('margin')
        dev_set_line_width (3)
        dev_display (Rectangle1Check)
        dev_display (Rectangle2Check)
        dev_set_draw ('fill')
        count_seconds (S3)
        * 生成测量矩形
        gen_measure_rectangle2 (Rect1RowCheck, Rect1ColCheck, AngleCheck, RectLength1, RectLength2, Width, Height, 'bilinear', MeasureHandle1)
        * 生成测量矩形
        gen_measure_rectangle2 (Rect2RowCheck, Rect2ColCheck, AngleCheck, RectLength1, RectLength2, Width, Height, 'bilinear', MeasureHandle2)
        * 测量边缘对
        measure_pairs (ImageCheck, MeasureHandle1, 2, 90, 'positive', 'all', RowEdgeFirst1, ColumnEdgeFirst1, AmplitudeFirst1, RowEdgeSecond1, ColumnEdgeSecond1, AmplitudeSecond1, IntraDistance1, InterDistance1)
        * 测量边缘对
        measure_pairs (ImageCheck, MeasureHandle2, 2, 90, 'positive', 'all', RowEdgeFirst2, ColumnEdgeFirst2, AmplitudeFirst2, RowEdgeSecond2, ColumnEdgeSecond2, AmplitudeSecond2, IntraDistance2, InterDistance2)
        * 注销测量句柄
        close_measure (MeasureHandle1)
        close_measure (MeasureHandle2)
        count_seconds (S4)
        dev_set_color ('red')
        * 显示线
        disp_line (WindowHandle, RowEdgeFirst1 - RectLength2 * cos(AngleCheck), ColumnEdgeFirst1 - RectLength2 * sin(AngleCheck), RowEdgeFirst1 + RectLength2 * cos(AngleCheck), ColumnEdgeFirst1 + RectLength2 * sin(AngleCheck))
        disp_line (WindowHandle, RowEdgeSecond1 - RectLength2 * cos(AngleCheck), ColumnEdgeSecond1 - RectLength2 * sin(AngleCheck), RowEdgeSecond1 + RectLength2 * cos(AngleCheck), ColumnEdgeSecond1 + RectLength2 * sin(AngleCheck))
        disp_line (WindowHandle, RowEdgeFirst2 - RectLength2 * cos(AngleCheck), ColumnEdgeFirst2 - RectLength2 * sin(AngleCheck), RowEdgeFirst2 + RectLength2 * cos(AngleCheck), ColumnEdgeFirst2 + RectLength2 * sin(AngleCheck))
        disp_line (WindowHandle, RowEdgeSecond2 - RectLength2 * cos(AngleCheck), ColumnEdgeSecond2 - RectLength2 * sin(AngleCheck), RowEdgeSecond2 + RectLength2 * cos(AngleCheck), ColumnEdgeSecond2 + RectLength2 * sin(AngleCheck))
        dev_set_line_width (1)
        NumLeads := |IntraDistance1| + |IntraDistance2|
        * 最小距离
        MinDistance := min([InterDistance1,InterDistance2])
        dev_set_window (WindowHandleText)
        dev_set_part (0, 0, 119, Width - 1)
        dev_clear_window ()
        * 显示信息
        disp_message (WindowHandleText, 'Matching: Time: ' + ((S2 - S1) * 1000)$'5.2f' + 'ms , Score: ' + Score$'7.5f', 'image', 20, 20, 'green', 'false')
        disp_message (WindowHandleText, 'Measure:  Time: ' + ((S4 - S3) * 1000)$'5.2f' + ' ms, Num. leads: ' + NumLeads$'2d', 'image', 50, 20, 'red', 'false')
        disp_message (WindowHandleText, '          Min. lead dist: ' + MinDistance$'6.3f', 'image', 80, 20, 'red', 'false')
    endif
    dev_error_var (Error, 1)
    dev_set_check ('~give_error')
    get_mposition (WindowHandle, R, C, Button)
    dev_error_var (Error, 0)
    dev_set_check ('give_error')
    if (Error != H_MSG_TRUE)
        Button := 0
    endif
endwhile
dev_set_window (WindowHandleText)
dev_close_window ()
* 注销模板句柄
clear_shape_model (ModelID)
* 关闭采集
close_framegrabber (FGHandle)

在这里插入图片描述


弧形测量工具算子

gen_measure_arc

gen_measure_arc (Row, Column, Radius, AngleStart, AngleExtend, 10, Width, Height, 'nearest_neighbor', MeasureHandle)
gen_measure_arc( : : CenterRow, CenterCol, Radius, AngleStart, AngleExtent, AnnulusRadius, Width, Height, Interpolation : MeasureHandle)
CenterRow (input_control)  point.y → (real / integer)
Row coordinate of the center of the arc.
Default value: 100.0
Suggested values: 10.0, 20.0, 50.0, 100.0, 200.0, 300.0, 400.0, 500.0
Typical range of values: 0.0 ≤ CenterRow ≤ 511.0 (lin)
Minimum increment: 1.0
Recommended increment: 10.0


enterCol (input_control)  point.x → (real / integer)
Column coordinate of the center of the arc.
Default value: 100.0
Suggested values: 10.0, 20.0, 50.0, 100.0, 200.0, 300.0, 400.0, 500.0
Typical range of values: 0.0 ≤ CenterCol ≤ 511.0 (lin)
Minimum increment: 1.0
Recommended increment: 10.0


Radius (input_control)  number → (real / integer)
Radius of the arc.
Default value: 50.0
Suggested values: 10.0, 20.0, 50.0, 100.0, 200.0, 300.0, 400.0, 500.0
Typical range of values: 0.0 ≤ Radius ≤ 511.0 (lin)
Minimum increment: 1.0
Recommended increment: 10.0


AngleStart (input_control)  angle.rad → (real / integer)
Start angle of the arc in radians.
Default value: 0.0
Suggested values: -3.14159, -2.35619, -1.57080, -0.78540, 0.0, 0.78540, 1.57080, 2.35619, 3.14159
Typical range of values: -3.14159 ≤ AngleStart ≤ 3.14159 (lin)
Minimum increment: 0.03142
Recommended increment: 0.31416


AngleExtent (input_control)  angle.rad → (real / integer)
Angular extent of the arc in radians.
Default value: 6.28318
Suggested values: -6.28318, -5.49779, -4.71239, -3.92699, -3.14159, -2.35619, -1.57080, -0.78540, 0.78540, 1.57080, 2.35619, 3.14159, 3.92699, 4.71239, 5.49779, 6.28318
Typical range of values: -6.28318 ≤ AngleExtent ≤ 6.28318 (lin)
Minimum increment: 0.03142
Recommended increment: 0.31416
Restriction: AngleExtent != 0.0

AnnulusRadius (input_control)  number → (real / integer)
Radius (half width) of the annulus.
Default value: 10.0
Suggested values: 10.0, 20.0, 50.0, 100.0, 200.0, 300.0, 400.0, 500.0
Typical range of values: 0.0 ≤ AnnulusRadius ≤ 511.0 (lin)
Minimum increment: 1.0
Recommended increment: 10.0
Restriction: AnnulusRadius <= Radius

Width (input_control)  extent.x → (integer)
Width of the image to be processed subsequently.
Default value: 512
Suggested values: 128, 160, 192, 256, 320, 384, 512, 640, 768
Typical range of values: 0 ≤ Width ≤ 1024 (lin)
Minimum increment: 1
Recommended increment: 16

Height (input_control)  extent.y → (integer)
Height of the image to be processed subsequently.
Default value: 512
Suggested values: 120, 128, 144, 240, 256, 288, 480, 512, 576
Typical range of values: 0 ≤ Height ≤ 1024 (lin)
Minimum increment: 1
Recommended increment: 16

Interpolation (input_control)  string → (string)
Type of interpolation to be used.
Default value: 'nearest_neighbor'
List of values: 'bicubic', 'bilinear', 'nearest_neighbor'

MeasureHandle (output_control)  measure_id → (integer)
Measure object handle.

弧形测量示例1:

* 读取图像
read_image (Zeiss1, 'zeiss1')
* 获取图像的大小
get_image_size (Zeiss1, Width, Height)
* 定义弧形信息
Row := 275
Column := 335
Radius := 107
AngleStart := -rad(55)
AngleExtend := rad(170)
* 生成测量弧形
gen_measure_arc (Row, Column, Radius, AngleStart, AngleExtend, 10, Width, Height, 'nearest_neighbor', MeasureHandle)
* 测量边缘
measure_pos (Zeiss1, MeasureHandle, 1, 10, 'all', 'all', RowEdge, ColumnEdge, Amplitude, Distance)
* 计算点与点的距离
distance_pp (RowEdge[1], ColumnEdge[1], RowEdge[2], ColumnEdge[2], IntermedDist)
* 注销测量句柄
close_measure (MeasureHandle)
dev_get_window (WindowHandle)
* 读取图像
read_image (Zeiss1, 'zeiss1')
* 获取图像的大小
get_image_size (Zeiss1, Width, Height)
* 定义弧形信息
Row := 275
Column := 335
Radius := 107
AngleStart := -rad(55)
AngleExtend := rad(170)
* 显示中心点
gen_cross_contour_xld (Cross, Row, Column, 26, 0.785398)
* 通过椭圆计算获取另一点坐标
get_points_ellipse (AngleStart + AngleExtend, Row, Column, 0, Radius, Radius, RowPoint, ColPoint)
* 圆心,旋转角度,起点坐标
disp_arc (WindowHandle, Row, Column, AngleExtend, RowPoint, ColPoint)
* 生成测量弧形
gen_measure_arc (Row, Column, Radius, AngleStart, AngleExtend, 10, Width, Height, 'nearest_neighbor', MeasureHandle)
* 测量边缘
measure_pos (Zeiss1, MeasureHandle, 1, 10, 'all', 'all', RowEdge, ColumnEdge, Amplitude, Distance)
* 计算点与点的距离
distance_pp (RowEdge[1], ColumnEdge[1], RowEdge[2], ColumnEdge[2], IntermedDist)
*显示结果
dev_set_line_width (5)
dev_set_color ('green')
disp_line (WindowHandle, RowEdge[1], ColumnEdge[1], RowEdge[2], ColumnEdge[2])
* 注销测量句柄
close_measure (MeasureHandle)

在这里插入图片描述

弧形测量示例2:

*  Example for the application of the measure package
* including a lot of visualization operators
* 
read_image (Zeiss1, 'zeiss1')
get_image_size (Zeiss1, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width / 2, Height / 2, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_display (Zeiss1)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* draw_circle (WindowHandle, Row, Column, Radius)
Row := 275
Column := 335
Radius := 107
AngleStart := -rad(55)
AngleExtent := rad(170)
dev_set_draw ('fill')
dev_set_color ('green')
dev_set_line_width (1)
get_points_ellipse (AngleStart + AngleExtent, Row, Column, 0, Radius, Radius, RowPoint, ColPoint)
disp_arc (WindowHandle, Row, Column, AngleExtent, RowPoint, ColPoint)
dev_set_line_width (3)
gen_measure_arc (Row, Column, Radius, AngleStart, AngleExtent, 10, Width, Height, 'nearest_neighbor', MeasureHandle)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
count_seconds (Seconds1)
n := 10
for i := 1 to n by 1
    measure_pos (Zeiss1, MeasureHandle, 1, 10, 'all', 'all', RowEdge, ColumnEdge, Amplitude, Distance)
endfor
count_seconds (Seconds2)
Time := (Seconds2 - Seconds1) / n
disp_continue_message (WindowHandle, 'black', 'true')
* stop ()
distance_pp (RowEdge[1], ColumnEdge[1], RowEdge[2], ColumnEdge[2], IntermedDist)
* dev_display (Zeiss1)
dev_set_color ('red')
* disp_circle (WindowHandle, RowEdge, ColumnEdge, RowEdge - RowEdge + 1)
disp_line (WindowHandle, RowEdge[1], ColumnEdge[1], RowEdge[2], ColumnEdge[2])
dev_set_color ('yellow')
disp_message (WindowHandle, 'Distance: ' + IntermedDist, 'image', 250, 80, 'yellow', 'false')
* dump_window (WindowHandle, 'tiff_rgb', 'C:\\Temp\\zeiss_result')
close_measure (MeasureHandle)
dev_set_line_width (1)
* disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_clear_window ()

在这里插入图片描述


示例3

* 读取图像
read_image (Image, 'double_circle')
* 窗口设置
dev_close_window ()
* 获取图像大小
get_image_size (Image, Width, Height)
* 打开窗口
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
* 阈值分割
fast_threshold (Image, Region, 0, 120, 7)
* 获取内边缘
boundary (Region, RegionBorder, 'inner')
* 相对于其最小的周围矩形剪裁一个区域。
clip_region_rel (RegionBorder, RegionClipped, 5, 5, 5, 5)
* 膨胀
dilation_circle (RegionClipped, RegionDilation, 2.5)
* 获取区域图像
reduce_domain (Image, RegionDilation, ImageReduced)
* 边缘提取
edges_sub_pix (ImageReduced, Edges, 'canny', 2, 20, 60)
* 分割线轮廓
segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 3)
* 计数
count_obj (ContoursSplit, Number)
dev_display (Image)
dev_set_draw ('margin')
dev_set_color ('white')
dev_update_window ('off')
for I := 1 to Number by 1
    * 选取对象
    select_obj (ContoursSplit, ObjectSelected, I)
    * 获取轮廓全局属性
    get_contour_global_attrib_xld (ObjectSelected, 'cont_approx', Attrib)
    * Fit a circle to the line segment that are arcs of a circle
    if (Attrib > 0)
        * 拟合圆轮廓
        fit_circle_contour_xld (ObjectSelected, 'ahuber', -1, 2, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
        * 生成圆轮廓
        gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, rad(360), 'positive', 1.0)
        dev_display (ContCircle)
    endif
endfor
* 设置窗口
dev_set_colored (12)
dev_set_line_width (3)
dev_display (ContoursSplit)

在这里插入图片描述

拟合

read_image (Image, 'fabrik')
* Image:原图
* ImaAmp:边缘幅度图像
* ImaDir:边缘方向图像
* 'lanser2':边缘梯度算子
*  0.5:平滑系数
* 'nms':非极大值抑制
* 12:比它小,就不是边缘
* 22:比它大,就是边缘
* 提取边缘轮廓
edges_image (Image, ImaAmp, ImaDir, 'lanser2', 0.5, 'nms', 12, 22)
* 阈值分割
threshold (ImaAmp, Edges, 1, 255)
* 提取骨架
skeleton (Edges, Skeleton)
* 通过骨架生成轮廓
gen_contours_skeleton_xld (Skeleton, Contours, 1, 'filter')
* 结果显示
dev_display (Image)
dev_set_colored (6)
dev_display (Contours)

在这里插入图片描述

* 读取图像
read_image (Image, 'fabrik')
* 边缘提取
frei_amp (Image, ImageEdgeAmp)
* 阈值分割
threshold (ImageEdgeAmp, Region, 20, 255)
* 提取骨架
skeleton (Region, Skeleton)
* 结果显示
dev_display (Image)
dev_set_color ('red')
dev_display (Skeleton)

在这里插入图片描述

* 窗口设置
dev_close_window ()
dev_update_window ('off')
* 生成矩形
gen_rectangle1 (Rectangle, 30, 20, 100, 100)
* 将区域转成二进制图像
region_to_bin (Rectangle, BinImage, 130, 100, 120, 130)
* 矩形轮廓区域图像获取
rectangle1_domain (BinImage, ImageReduced, 20, 48, 40, 52)
* 中值滤波
mean_image (ImageReduced, SmoothedImage, 15, 15)
* 涂色
paint_gray (SmoothedImage, BinImage, Image)
* 获取图像大小
get_image_size (Image, Width, Height)
* 打开窗口
dev_open_window_fit_image (Image, 0, 0, Width, Height, WindowID)
dev_set_draw ('margin')
dev_set_line_width (3)
dev_display (Image)
stop ()
* 获取矩形区域图像
rectangle1_domain (Image, ImageReduced, 5, 5, 125, 115)
* 提取边缘
edges_sub_pix (ImageReduced, Edges, 'lanser2', 1.1, 22, 30)
* 显示图像
dev_display (Image)
dev_display (Edges)
* 分割轮廓
segment_contours_xld (Edges, LineSegments, 'lines', 5, 4, 2)
* 计算回归线参数
regress_contours_xld (LineSegments, RegressContours, 'no', 1)
* 合并轮廓
union_collinear_contours_xld (RegressContours, UnionContours, 10, 1, 2, 0.1, 'attr_keep')
* 轮廓排序
sort_contours_xld (UnionContours, SortedContours, 'upper_left', 'true', 'column')
* 显示图像
dev_display (Image)
colored_display (SortedContours, ['yellow','white','white','yellow'])
dev_update_window ('on')

在这里插入图片描述

测量助手

在这里插入图片描述

二维测量 二维测量 二维测量

  • 9
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值