halcon 测量拟合

一维测量的原理

原理:灰度投影+导数(最小幅度值)

1、Halocn的一维测量首先构建矩形或者扇形的ROI测量对象,然后在ROI内画出等距离的、长度与ROI宽度一致的、垂直于ROI的轮廓线(profile line)的等距线

2、测量ROI的轮廓线尽量与被测边缘垂直,宽度适当宽些

3、然后,沿着垂直轮廓线的方向,计算出每一条等距线的平均灰度值,可以得出轮廓线的灰度直方图,同时可以选择使用高斯滤波器平滑灰度直方图

       如果等距线不是垂直或水平的,那么等距线经过的就不是一个完整的像素,需要进行插值处理。构建测量对象的算子(如gen_measure_rectangle2)的参数Interpolation可以决定插值的方法, 设置Interpolation = ’nearest_neighbor’则取最近像素的灰度值,这种方法速度最快,但精度低,设置Interpolation = ’bilinear’采用双线性插值法,这种方法精度最高但是速度最慢。
      等距线的长度,也就是ROI的宽度影响了轮廓线垂直方向上的平均灰度值。因此,如果我们想要检测的边缘垂直于轮廓线的话,ROI的宽度尽量打,否则,尽量小。如果边缘不垂直于轮廓线,获取到的灰度直方图会含有较多噪声,检测到的边缘会不那么准确。

4、求出平滑灰度直方图的一阶导数,(一阶导数为最大,二阶导数为0)一阶导数的极值点作为边缘的亚像素精度候选点,只有一阶导数极值点的绝对值大于预先设定的阈值(测量算子的参数Threshold)边缘候选点才被选作为边缘中心点(沿着刨分线的放向的一阶导数)

然后用高斯平滑滤波器对轮廓进行平滑(见图2.2和f中的粗线),其标准差用测量算子(例如,measure_pairs)的参数Sigma指定。现在,计算光滑轮廓的一阶导数(图2.2 -f中的细线)。注意导数的振幅是按系数V2n缩放的。一阶导数的所有局部极值的亚像素精确位置都是候选边缘。在图2.3a中,这些候选边缘由从导数的各自位置(细线)指向平滑的灰度值轮廓(粗线)的向量表示。只有那些一阶导数绝对值大于给定阈值(测量算子的另一个参数)的候选边缘才被认为是图像中的边缘(见图2.3b)。对于每条边,返回它与轮廓线交点的位置。图2.4为检测到的边缘

首先查看要提取边界黑白界限的灰度值GrayLightValue、GrayDarkValue,求差值SubGrayValue = GrayLightValue - GrayDarkValue,其实SubGrayValue 这个值就是灰度图像某个位置的一阶导数,最后计算幅度值AmplitudeValue = SubGrayValue x Sigma x sqrt(2π) (大致值,因为过程中没有插值运算,平均灰度值也是按照一个像素宽计算的,但相差不大)优点是可以快速调试参数,且如果在现场调试可以脱离Halcon软件;缺点会有微小误差。 

gen_measure_rectangle2

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

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 

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

measure_pairs(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)


Parameters

Sigma:平滑参数
Threshold:最小边缘振幅
Transition:找的正边缘还是负边缘(第一个边缘)
Select :选第一条边,还是最后一条,还是所有的边
RowEdgeFirst:边缘对中的第一个边缘的行坐标
ColumnEdgeFirst:边缘对中第一个边缘的列坐标
AmplitudeFirst:边缘对中第一个边缘的幅度值(就是一阶导数)
RowEdgeSecond:边缘对中的第二个边缘的行坐标
ColumnEdgeSecond:边缘对中第二个边缘的列坐标
AmplitudeSecond:边缘对中第二个边缘的幅度值(就是一阶导数)
IntraDistance :边缘对中左右边缘之间的距离
InterDistance:相邻两个边缘对中心的的距离

measure_pos 

measure_pos (Fuse, MeasureHandle, 1, 30, 'all', 'all', RowEdge, ColumnEdge, Amplitude, 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.

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  

* 设置窗口
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)


案例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)

案例4 

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)

案例5

* 窗口设置
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')

测量专栏-直线度

1.1什么是直线度
直线度公差指单一实际直线允许的变动全量。用于控制平面或空间直线的形状误差,其公差带根据不同的情况有几种不同的形式。

1.2直线度评价方式
直线度误差的检测一般可采用“与理想要素比较原则”、“测量特征原则”、和“控制实段边介原则”。其中“与理想要素比较原则”应用最多。这时理想直线采用以下两种形式来体现。
(1)实物形式体现理想直线,可采用平尺、刀口尺(样板直齿)、精密平板和拉紧钢丝等来体现理想直线。
(2)自然物理形式体现理想直线
①利用光学原理制成的准直仪类仪器和各种干涉仪。
②利用水平物理|生质构成的水平仪类仪器(框式水平仪、全像水平仪、电子水平仪等)。

1.3halcon实现方式
针对直线度的评价方式进行直线测量。1:先对初始直线进行直线测量,精准的判断出当前直线的起始和终点坐标。2:根据直线的角度和长度,以10个像素单位间隔进行测量矩形逐个测量,用于判断直线的误差。
halcon所采取的实现方式,是如上所述。绘制理想直线,然后判断边缘在直线上的波动值。
绘制ROI时,应该尽可能的绘制完好,贴合直线。但是如何绘制不好时也没有问题,在下一步直线测量中会对ROI的坐标进行矫正。
对获取到的ROI进行直线测量,用于对直线ROI的矫正,和获取到基准测量直线,生成理想直线。
这个不同于直线测量在于,直线测量会判断当前点是否符合拟合参数,如果不符合时则会自动剔除,但是我们需要获取到全部的拟合点,才能有效的判断直线度是否正确。最终结果输出最大直线度。

read_image (Image1, 'C:/Users/g/Desktop/33.png')
decompose3 (Image1, Image, Image2, Image3)
*绘制直线ROI
gen_region_line (ROI_0, 66, 46,66,510)
********************************直线测量*********************************
create_metrology_model (MetrologyHandle)
add_metrology_object_line_measure (MetrologyHandle,66, 46,66,510, 20, 3, 1, 30, [], [], Index)
set_metrology_object_param (MetrologyHandle, 'all', ['measure_transition','measure_select'], ['uniform','first'])
apply_metrology_model (Image, MetrologyHandle)
**************************************获取结果显示***********************************
get_metrology_object_result (MetrologyHandle, 'all', 'all', 'used_edges', 'row', UsedRow)
get_metrology_object_result (MetrologyHandle, 'all', 'all', 'used_edges', 'column', UsedColumn)
*显示测量矩形
get_metrology_object_measures (Contours, MetrologyHandle, 'all', 'all', Row1, Column1)
*创建测量矩形中点
gen_cross_contour_xld (UsedEdges, UsedRow, UsedColumn, 10, 1)
*获取直线ROI坐标
get_metrology_object_result_contour (ResultContours, MetrologyHandle, 'all', 'all', 1.5)
get_metrology_object_result (MetrologyHandle, Index, 'all', 'result_type', 'row_begin', row1)
get_metrology_object_result (MetrologyHandle, Index, 'all', 'result_type', 'row_end', row2)
get_metrology_object_result (MetrologyHandle, Index, 'all', 'result_type', 'column_begin', column1)
get_metrology_object_result (MetrologyHandle, Index, 'all', 'result_type', 'column_end', column2)
***********************************图像显示**************
dev_display (Image)
dev_display(Contours)
dev_display(UsedEdges)
dev_display (ResultContours)
*获取直线角度
line_orientation (row1, column1, row2, column2, Phi)
distance_pp (row1, column1, row2, column2, Distance)
*以10个像素为单位做测量间隔
tuple_ceil (Distance/10, Ceil)

get_image_size (Image, Width, Height)
tuple_sin (Phi, Sin)
tuple_cos (Phi, Cos)
Dis:=[]
gen_empty_obj (EmptyObject)
for Index1 := 0 to Ceil-1 by 1
    *创建测量矩形
    gen_measure_rectangle2 (row1+10*Index1*Sin, column1+10*Index1*Cos, Phi-rad(90), 50, 5, Width, Height, 'nearest_neighbor', MeasureHandle)
    *绘制显示的矩形轮廓
    *当所被测量的区域有多条直线时,会干扰到直线度的测量。将下列算子中的“50”(测量矩形的高度)减小即可
    gen_rectangle2_contour_xld (Rectangle, row1+10*Index1*Sin, column1+10*Index1*Cos, Phi-rad(90), 50, 5)
    dev_display (Image)
    dev_display (Rectangle)
    measure_pos (Image, MeasureHandle, 1, 30, 'all', 'first', RowEdge, ColumnEdge, Amplitude, Distance1)
    *绘制采样点
    gen_cross_contour_xld (Cross, RowEdge, ColumnEdge, 100, 1)
    *图像显示
    concat_obj (Cross, EmptyObject, EmptyObject)
    distance_pl (RowEdge, ColumnEdge, row1, column1, row2, column2, Distance2)
    Dis:=[Dis,Distance2]
endfor
tuple_max (Dis, Max)
tuple_min (Dis, Min)
tuple_abs (Max, Max)
tuple_abs (Min, Min)
if (Max>=Min)
    Circle_Max:=Max
else
    Circle_Max:=Min
endif
dev_display (Image)
dev_display (ResultContours)
dev_display (EmptyObject)

 

2D测量简介 

2、相关算子详细介绍

2.1 创建测量模型

相关算子:
create_metrology_model() ——创建测量几何图形所需的数据结构/模型。

create_metrology_model( MetrologyHandle)
2.2 设置测量对象图像的大小

相关算子:
set_metrology_model_image_size() ——设置测量对象图像的大小

set_metrology_model_image_size( MetrologyHandle, Width, Height)
2.3 创建测量模型ROI

目的:提供近似值;将测量对象添加到模型中,同时将测量对象的近似参数和控制测量的参数添加到模型中。
相关算子:
① add_metrology_object_circle_measure() ——将圆或圆弧添加到度量模型中

add_metrology_object_circle_measure(
    MetrologyHandle, //输入测量模型的句柄
    Row, //输入圆心的行
    Column, //输入圆心的列
    Radius, //输入圆的半径
    MeasureLength1, //输入垂直于边界的测量区域的一半长度;默认值:20,参考值:10,20,30
    MeasureLength2, //输入与边界相切的测量区域的一半长度;默认值:5,参考值:3,5,10
    MeasureSigma, //输入用于平滑的高斯函数的sigma;默认值:1,参考值:0.4,0.6,0.8,1.0,1.5,2.0,3.0,4.0,5.0,7.0,10.0
    MeasureThreshold, //输入测量阈值;默认值:30,参考值:5.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 90.0, 110.0
    GenParamName, //输入参数名称;参考: ‘distance_threshold’, ‘end_phi’, ‘instances_outside_measure_regions’, ‘max_num_iterations’, ‘measure_distance’, ‘measure_interpolation’, ‘measure_select’, ‘measure_transition’, ‘min_score’, ‘num_instances’, ‘num_measures’, ‘point_order’, ‘rand_seed’, ‘start_phi’
    GenParamValue, //输入参数值;参考:1, 2, 3, 4, 5, 10, 20, ‘all’, ‘true’, ‘false’, ‘first’, ‘last’, ‘positive’, ‘negative’, ‘uniform’, ‘nearest_neighbor’, ‘bilinear’, ‘bicubic’
    Index //输出创建测量对象的索引值
    )

② add_metrology_object_ellipse_measure() ——将椭圆或椭圆弧添加到度量模型中

add_metrology_object_ellipse_measure(
    MetrologyHandle, //输入测量模型的句柄
    Row, //输入椭圆圆心的行
    Column, //输入椭圆圆心的列
    Phi, //输入椭圆角度
    Radius1, //输入椭圆长半轴
    Radius2, //输入椭圆短半轴
    MeasureLength1, //输入垂直于边界的测量区域的一半长度;默认值:20,参考值:10,20,30
    MeasureLength2, //输入与边界相切的测量区域的一半长度;默认值:5,参考值:3,5,10
    MeasureSigma, //输入用于平滑的高斯函数的sigma;默认值:1,参考值:0.4,0.6,0.8,1.0,1.5,2.0,3.0,4.0,5.0,7.0,10.0
    MeasureThreshold, //输入测量阈值;默认值:30,参考值:5.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 90.0, 110.0
    GenParamName, //输入参数名称
    GenParamValue, //输入参数值
    Index //输出创建测量对象的索引值
    )

③ add_metrology_object_line_measure() ——将直线添加到度量模型中

add_metrology_object_line_measure(
    MetrologyHandle, //输入测量模型的句柄
    RowBegin, //输入测量区域行坐标起点
    ColumnBegin, //输入测量区域列坐标起点
    RowEnd, //输入测量区域行坐标终点
    ColumnEnd, //输入测量区域列坐标终点
    MeasureLength1, //输入垂直于边界的测量区域的一半长度;默认值:20,参考值:10,20,30
    MeasureLength2, //输入与边界相切的测量区域的一半长度;默认值:5,参考值:3,5,10
    MeasureSigma, //输入用于平滑的高斯函数的sigma;默认值:1,参考值:0.4,0.6,0.8,1.0,1.5,2.0,3.0,4.0,5.0,7.0,10.0
    MeasureThreshold, //输入测量阈值;默认值:30,参考值:5.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 90.0, 110.0
    GenParamName, //输入参数名称
    GenParamValue, //输入参数值
    Index //输出创建测量对象的索引值
    )

④ add_metrology_object_rectangle2_measure() ——将一个矩形添加到度量模型中

add_metrology_object_rectangle2_measure(
    MetrologyHandle, //输入测量模型的句柄
    Row, //输入矩形中心点行坐标
    Column, //输入矩形中心点列坐标
    Phi, //输入主轴 Phi 的方向, Phi 的输入值会自动映射到区间(-3.14 ,3.14)
    Length1, //输入矩形较长的半边长 Length1 
    Length2, //输入矩形较短的半边长 Length2
    MeasureLength1, //输入垂直于边界的测量区域的一半长度;默认值:20,参考值:10,20,30
    MeasureLength2, //输入与边界相切的测量区域的一半长度;默认值:5,参考值:3,5,10
    MeasureSigma, //输入用于平滑的高斯函数的sigma;默认值:1,参考值:0.4,0.6,0.8,1.0,1.5,2.0,3.0,4.0,5.0,7.0,10.0
    MeasureThreshold, //输入测量阈值;默认值:30,参考值:5.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 90.0, 110.0
    GenParamName, //输入参数名称
    GenParamValue, //输入参数值
    Index //输出创建测量对象的索引值
    )

⑤ add_metrology_object_generic() ——将测量对象添加到测量模型中

add_metrology_object_generic(
    MetrologyHandle, //输入测量模型的句柄
    Shape, //输入要测量对象的类型;默认值:‘circle’,参考值:‘circle’,‘ellipse’,‘line’,‘rectangle2’
    ShapeParam, //要添加的测量对象的参数
    MeasureLength1, //输入垂直于边界的测量区域的一半长度;默认值:20,参考值:10,20,30;最小增量:1.0;建议增量:10.0
    MeasureLength2, //输入与边界相切的测量区域的一半长度;默认值:5,参考值:3,5,10;最小增量:1.0;建议增量:10.0
    MeasureSigma, //输入用于平滑的高斯函数的sigma;默认值:1,参考值:0.4,0.6,0.8,1.0,1.5,2.0,3.0,4.0,5.0,7.0,10.0;最小增量:0.01;建议增量:0.1;限制:(0.4 <= MeasureSigma)&&(MeasureSigma <= 100)
    MeasureThreshold, //输入测量阈值/最小边缘幅度;默认值:30,参考值:5.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 90.0, 110.0;最小增量:0.5;建议增量:2
    GenParamName, //输入参数名称;参考: ‘distance_threshold’, ‘end_phi’, ‘instances_outside_measure_regions’, ‘max_num_iterations’, ‘measure_distance’, ‘measure_interpolation’, ‘measure_select’, ‘measure_transition’, ‘min_score’, ‘num_instances’, ‘num_measures’, ‘point_order’, ‘rand_seed’, ‘start_phi’
    GenParamValue, //输入参数值;参考:1, 2, 3, 4, 5, 10, 20, ‘all’, ‘true’, ‘false’, ‘first’, ‘last’, ‘positive’, ‘negative’, ‘uniform’, ‘nearest_neighbor’, ‘bilinear’, ‘bicubic’
    Index //输出创建测量对象的索引值
    )
2.4 设置测量(模型/对象)参数

相关算子:
① set_metrology_model_param() ——设置测量模型的参数

set_metrology_model_param(
    MetrologyHandle, //输入测量模型的句柄
    GenParamName, //输入参数名称;参考: ‘camera_param’,输入相机参数由GenParamName= 'camera_param’指定,CameraParam是相机;‘plane_pose’(是否相机三维姿态);‘reference_system’(根据图像坐标系的平移(行、列)和旋转角度(角度),定义一种新的参考系统);‘scale’(期望单位与原始单位的比率);
    GenParamValue //输入参数值;参考:1.0, 0.1, ‘m’, ‘cm’, ‘mm’, ‘microns’, ‘um’;
    )

② set_metrology_object_param() ——为测量模型的测量对象设置参数

set_metrology_object_param(
    MetrologyHandle, //输入测量模型的句柄
    Index, //指定测量对象,为all时所有计量对象的参数都被设置(‘all’)
    GenParamName, //输入参数名称;默认:‘num_instances’,参考:'distance_threshold', 'instances_outside_measure_regions', 'max_num_iterations', 'measure_distance', 'measure_interpolation', 'measure_length1', 'measure_length2', 'measure_select', 'measure_sigma', 'measure_threshold', 'measure_transition', 'min_score', 'num_instances', 'num_measures', 'rand_seed'
    GenParamValue //输入参数值;默认:1,参考:1, 2, 3, 4, 5, 10, 20, ‘all’, ‘true’, ‘false’, ‘first’, ‘last’, ‘positive’, ‘negative’, ‘uniform’, ‘nearest_neighbor’, ‘bilinear’, ‘bicubic’
    )

其中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':拟合,距离阈值 

2.5 校准测量模型

相关算子:
align_metrology_model() ——测量模型的对齐/校准

align_metrology_model(
    MetrologyHandle, //输入测量模型的句柄
    Row, //对齐测量模型的行坐标
    Column, //对齐测量模型的列坐标
    Angle,//对齐测量模型的旋转角度
    )
2.6 应用测量

相关算子:
apply_metrology_model() ——测量并拟合计量模型中所有计量对象的几何形状

apply_metrology_model(
    Image, //输入的测量图像
    MetrologyHandle //输入测量模型的句柄
    )
2.7 获取测量结果

相关算子:
① get_metrology_object_result() ——获取测量模型的测量结果

get_metrology_object_result(
    MetrologyHandle, //输入测量模型的句柄
    Index, //输出测量对象的索引;默认值:‘all’,参考:‘all’,0,1,2
    Instance, //输入测量对象的实例;默认值:‘all’,参考:‘all’,0,1,2
    GenParamName, //输入参数名称;默认值:‘result_type’,参考:‘angle_direction’,‘result_type’,‘used_edges’
    GenParamValue, //输入参数值;默认值:‘all_param’,参考:‘all_param’, ‘score’, ‘true’, ‘false’, ‘row’, ‘column’, ‘amplitude’, ‘radius’, ‘phi’, ‘radius1’, ‘radius2’, ‘length1’, ‘length2’, ‘row_begin’, ‘column_begin’, ‘row_end’, ‘column_end’, ‘nrow’, ‘ncolumn’, ‘distance’, ‘x’, ‘y’, ‘x_begin’, ‘y_begin’, ‘x_end’, ‘y_end’, ‘nx’, ‘ny’, ‘positive’, ‘negative’
    Parameter//输出结果值
    )

其中
GenParamName:
 (1)‘result_type’:如果GenParamName设置为’result_type’,则GenParamValue允许控制计量对象的返回方式和结果。
 (2)‘angle_direction’:该参数确定由拟合产生的角度的旋转方向。将参数’angle_direction’设置为’正’,在物体的主轴和坐标系的水平轴之间以数学正方向(逆时针方向)指定角度。将参数’angle_direction’设置为’负’,在对象的主轴和坐标系的水平轴之间沿数学负方向(顺时针)指定角度。角度的结果以弧度返回。
 默认值:‘正面’,参考:‘正面’,‘负面’;
 (3)‘used_edges’:要查询实际用于拟合度量对象的边缘点,可以选择以下GenParamValue值:
   ‘行’:返回用于拟合度量对象的边的行坐标。
   ‘列’:返回用于拟合度量对象的边的列坐标。
   ‘振幅’:返回用于拟合度量对象的边缘的边缘幅度。
GenParamValue:
如果GenParamValue设置为’all_param’,则返回计量对象的所有测量参数。
  对于圆,返回值是中心的坐标和圆的半径。顺序分别是[‘row’,‘column’,‘radius’]或[‘x’,‘y’,‘radius’]。
  对于椭圆,返回值是中心的坐标,长轴’phi’的方向,较大半轴’radius1’的长度,以及椭圆的较小半轴’radius2’的长度。顺序分别是[‘row’,‘column’,‘phi’,‘radius1’,‘radius2’]或[‘x’,‘y’,‘phi’,‘radius1’,‘radius2’]。
  对于一条线,返回该线的起点和终点。顺序是[‘row_begin’,‘column_begin’,‘row_end’,‘column_end’]或[‘x_begin’,‘y_begin’,‘x_end’,‘y_end’]
  对于矩形,返回值是中心的坐标,主轴’phi’的方向,较大的半边’length1’的长度,以及矩形的较小半边’length2’的长度。顺序分别是[‘row’,‘column’,‘phi’,‘length1’,‘length2’]或[‘x’,‘y’,‘phi’,‘length1’,‘length2’]。

② get_metrology_object_measures() ——获取测量区域和测量模型的测量对象的边缘位置结果

get_metrology_object_measures(
    Contours, //输出测量对象测量区域的矩形XLD轮廓
    MetrologyHandle, //输入测量模型的句柄
    Index, //输出测量对象的索引;默认值:‘all’,参考:‘all’,0,1,2
    Transition, //输入选择浅色/深色或深色/浅色边缘;默认值:‘all’,可选:‘全部’,‘负面’,‘正面’
    Row, //输出测量边缘的行坐标
    Column //输出测量边缘的列坐标
    )

③ get_metrology_object_result_contour() ——查询(获取)测量对象的结果轮廓

get_metrology_object_result_contour(
    Contour, //输出给定测量对象的结果轮廓
    MetrologyHandle, //输入测量模型的句柄
    Index, //输出测量对象的索引;默认值:‘all’,参考:‘all’,0,1,2
    Instance, //输入测量对象的实例;默认值:‘all’,参考:‘all’,0,1,2
    Resolution //输入相邻轮廓点之间的距离;默认值:1.5,参考:Resolution >= 1.192e-7
    )
2.8 释放测量模型

相关算子:
    clear_metrology_model() —— 删除测量模型并释放分配的内存

3、2D测量实战

精确测量下列图像中圆和矩形
在这里插入图片描述
实现代码:

* 实现圆和矩形的测量

****************************第一步:图像显示初始化****************************
* Display initializations
dev_update_off ()
read_image (Image, 'pads')
*获取图像宽和高
get_image_size (Image, Width, Height)
dev_close_window ()
*打开一个新的图像窗口,该窗口保留给定图像的长宽比
*打开具有给定最小和最大范围的新图形窗口,以便保留给定图像的纵横比。
*WidthLimit设置为-1,则使用以下默认值:[500,800]。
*HeightLimit设置为-1,则使用以下默认值:[400,600]。
*如果根据窗口宽高限制无法创建窗口,则忽略最小窗口大小的限制
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
*用来设置当前窗口的字体属性
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')

****************************第二步:定义近似的位置和测量圆圈的公差,其实就是手动设置圆存在的中心点位置****************************
*圆心横坐标设定,输出:[52, 141, 230, 319, 408, 497]  从52开始,到500结束,每个数等于前一个数加89
RowCircle := [52:89:500]

*输出:[52, 141, 230, 319, 408, 497, 52, 141, 230, 319, 408, 497]   合并2个数组(此处是分成两列的行值)
CircleInitRow := [RowCircle,RowCircle]

*gen_tuple_const(6,348)  输出:[348, 348, 348, 348, 348, 348]  生成6个相同值的数组
CircleInitColumn := [gen_tuple_const(6,348),gen_tuple_const(6,438)]
gen_circle (Circle, 52,348, 10)
*cross生成轮廓,Row行坐标,Col列坐标,Size十字型长度,Angle十字形方向
gen_cross_contour_xld (Cross1, CircleInitRow, CircleInitColumn, 6, 0.785398)

*定义半径,gen_tuple_const(n,m)  创建一个具有n个元素的,每个元素都为m的数据
CircleInitRadius := [gen_tuple_const(6,23),gen_tuple_const(6,23)]
*环状区域宽度可允许范围
CircleRadiusTolerance := 12

****************************第三步:定义近似的位置和测量矩形的公差,设置矩形的轮廓区域****************************
*矩形中心点行坐标
RectangleInitRow := [410,410]
* 矩形中心点列坐标(数量和ROW相同)
RectangleInitColumn := [215,562]
*矩形起始角度
RectangleInitPhi := [0,0]
*矩形行长的一半
RectangleInitLength1 := [85,85]
*矩形列长的一半
RectangleInitLength2 := [88,88]
*矩形测量的环状区域宽度
RectangleTolerance := 10
* 
gen_rectangle2 (Rectangle, RectangleInitRow, RectangleInitColumn, RectangleInitPhi, RectangleInitLength1, RectangleInitLength2)
 
****************************第四步:创建测量模型****************************
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)
*这里要知道RectangleParameter检测结果参数的数据结构信息
* Extract the parameters for better readability
Sequence := [0:5:|RectangleParameter| - 1]
RectangleRow := RectangleParameter[Sequence]
RectangleColumn := RectangleParameter[Sequence + 1]
RectanglePhi := RectangleParameter[Sequence + 2]
RectangleLength1 := RectangleParameter[Sequence + 3]
RectangleLength2 := RectangleParameter[Sequence + 4]

gen_rectangle2 (Rectangle1, RectangleRow, RectangleColumn, RectanglePhi, RectangleLength1, RectangleLength2)
*获取圆形检测结果
get_metrology_object_result (MetrologyHandle, MetrologyCircleIndices, 'all', 'result_type', 'all_param', CircleParameter)
* Extract the parameters for better readability
Sequence := [0:3:|CircleParameter| - 1]
CircleRow := CircleParameter[Sequence]
CircleColumn := CircleParameter[Sequence + 1]
CircleRadius := CircleParameter[Sequence + 2]
* 
* Display the results
* 
* 获取测量conturs
get_metrology_object_result_contour (Contours, MetrologyHandle, 'all', 'all', 1.5)

*获取到检测区域的conturs,以及轮廓坐标,并根据这些坐标去拟合成圆或矩形
get_metrology_object_measures (Contour, MetrologyHandle, 'all', 'all', Row1, Column1)
gen_cross_contour_xld (Cross, Row1, Column1, 6, 0.785398)

* Display everything
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')
stop ()
* Clean up memory
clear_metrology_model (MetrologyHandle)

实现结果:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值