read_image (Image, 'test.bmp')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle)
dev_display (Image)
dev_set_draw ('margin')
draw_line (WindowHandle, Row1, Column1, Row2, Column2)
draw_circle (WindowHandle, Row, Column, Radius)
*【输入】
StartRow:=Row1
StartCol:=Column1
EndRow:=Row2
EndCol:=Column2
*卡尺宽度
RuleWidth:=40
*卡尺高度
RuleHeight:=1
*卡尺阈值
RuleThd:=5
*卡尺间隔
RuleSpace:=2
*搜索模式
RuleMode:='negative'
*点选择
RuleSeleP:='all'
*【输出】
LineRow0:=0
LineCol0:=0
LineRow1:=0
LineCol1:=0
PointRows:=[]
PointCols:=[]

MeasureLine (Image, Contours, Rectangle, StartRow, StartCol, EndRow, EndCol, RuleWidth, RuleHeight, RuleSpace, RuleThd, RuleSeleP, RuleMode, PointRows, PointCols, LineRow0, LineCol0, LineRow1, LineCol1)

MeasureCircle (Image, Contours, Row, Column, Radius, RuleWidth, RuleHeight, RuleSpace, RuleThd, RuleSeleP, RuleMode, PointRows, PointCols, CircleRow, CircleCol, CircleRad)

*显示
dev_display (Image)
dev_display (Rectangle)
dev_set_color ('spring green')
dev_display (Contours)
dev_set_color ('orange')
gen_cross_contour_xld (Cross, PointRows, PointCols, 6, 0.785398)
dev_set_color ('red')
gen_circle_contour_xld (ContCircle, CircleRow, CircleCol, CircleRad, 0, 6.28318, 'positive', 1)
gen_contour_polygon_xld (Contour, [LineRow0,LineRow1], [LineCol0,LineCol1])
main
*直线测量
create_metrology_model (MetrologyHandle)
add_metrology_object_line_measure (MetrologyHandle, StartRow, StartCol, EndRow, EndCol, 100, 20, 1, 30, [], [], Index)
*搜索宽度
set_metrology_object_param (MetrologyHandle, Index, 'measure_length1', RuleWidth)
*有效搜索高度
set_metrology_object_param (MetrologyHandle, Index, 'measure_length2', RuleHeight)
*搜索间隔
set_metrology_object_param (MetrologyHandle, Index, 'measure_distance', RuleSpace)
*边缘阈值
set_metrology_object_param (MetrologyHandle, Index, 'measure_threshold', RuleThd)
*边缘选择
set_metrology_object_param (MetrologyHandle, Index, 'measure_select',RuleSeleP)
*过度方式
set_metrology_object_param (MetrologyHandle, Index, 'measure_transition', RuleMode)
*对图像进行测量
apply_metrology_model (Image, MetrologyHandle)
*测量点
get_metrology_object_measures (Contours, MetrologyHandle, Index, RuleMode, PointRows, PointCols)
*测量直线
get_metrology_object_result (MetrologyHandle, Index, 'all', 'result_type', ['row_begin', 'column_begin', 'row_end', 'column_end'], Parameter)
*外围矩形
angle_lx (StartRow, StartCol, EndRow, EndCol, Angle)
length1:=sqrt((StartCol-EndCol)*(StartCol-EndCol)+(StartRow-EndRow)*(StartRow-EndRow))
gen_rectangle2 (Rectangle, (StartRow+EndRow)/2, (StartCol+EndCol)/2, Angle, length1/2, RuleWidth)
LineRow0:=Parameter[0]
LineCol0:=Parameter[1]
LineRow1:=Parameter[2]
LineCol1:=Parameter[3]
return ()
MeasureLine
*圆测量
create_metrology_model (MetrologyHandle)
add_metrology_object_circle_measure (MetrologyHandle, Row, Column, Radius, 20, 5, 1, 30, [], [], Index)
*搜索宽度
set_metrology_object_param (MetrologyHandle, Index, 'measure_length1', RuleWidth)
*有效搜索高度
set_metrology_object_param (MetrologyHandle, Index, 'measure_length2', RuleHeight)
*搜索间隔
set_metrology_object_param (MetrologyHandle, Index, 'measure_distance', RuleSpace)
*边缘阈值
set_metrology_object_param (MetrologyHandle, Index, 'measure_threshold', RuleThd)
*边缘选择
set_metrology_object_param (MetrologyHandle, Index, 'measure_select',RuleSeleP)
*过度方式
set_metrology_object_param (MetrologyHandle, Index, 'measure_transition', RuleMode)
*对图像进行测量
apply_metrology_model (Image, MetrologyHandle)
*测量点
get_metrology_object_measures (Contours, MetrologyHandle, Index, RuleMode, PointRows, PointCols)
*测量圆
get_metrology_object_result (MetrologyHandle, Index, 'all', 'result_type', ['row', 'column', 'radius'], Parameter)
CircleRow:=Parameter[0]
CircleCol:=Parameter[1]
CircleRad:=Parameter[2]
return ()
MeasureCircle

 

set_system ('clip_region', 'false')

*圆测量
create_metrology_model (MetrologyHandle)
add_metrology_object_circle_measure (MetrologyHandle, Row, Column, Radius, 20, 5, 1, 30, [], [], Index)
*搜索宽度 int
set_metrology_object_param (MetrologyHandle, Index, 'measure_length1', RuleWidth)
*有效搜索高度 int
set_metrology_object_param (MetrologyHandle, Index, 'measure_length2', RuleHeight)
*搜索间隔 int
set_metrology_object_param (MetrologyHandle, Index, 'measure_distance', RuleSpace)
*边缘阈值 byte
set_metrology_object_param (MetrologyHandle, Index, 'measure_threshold', RuleThd)
*边缘选择 first last
set_metrology_object_param (MetrologyHandle, Index, 'measure_select',RuleSeleP)
*过度方式 positive negative
set_metrology_object_param (MetrologyHandle, Index, 'measure_transition', RuleMode)
*对图像进行测量
apply_metrology_model (Image, MetrologyHandle)
*测量圆
get_metrology_object_result (MetrologyHandle, Index, 'all', 'result_type', ['row', 'column', 'radius'], Parameter)
if (|Parameter|=3)
    *获取多个找圆矩形小轮廓和边缘点
    get_metrology_object_measures (Contours, MetrologyHandle, Index, RuleMode, PointRows, PointCols)
    *边缘点的十字标
    gen_cross_contour_xld (Cross, PointRows, PointCols, 5, 0)
    *圆心的十字标
    gen_cross_contour_xld (CrossCenter, Parameter[0], Parameter[1], 10, rad(45))
    *拟合的圆轮廓
    gen_circle_contour_xld (ContCircle, Parameter[0], Parameter[1], Parameter[2], 0, 6.28318, 'positive', 1)
endif
*测量点

clear_metrology_model (MetrologyHandle)
新版圆测量
set_system ('clip_region', 'false')

*直线测量
create_metrology_model (MetrologyHandle)
add_metrology_object_line_measure (MetrologyHandle, StartRow, StartCol, EndRow, EndCol, 100, 20, 1, 30, [], [], Index)
*搜索宽度
set_metrology_object_param (MetrologyHandle, Index, 'measure_length1', RuleWidth)
*有效搜索高度
set_metrology_object_param (MetrologyHandle, Index, 'measure_length2', RuleHeight)
*搜索间隔
set_metrology_object_param (MetrologyHandle, Index, 'measure_distance', RuleSpace)
*边缘阈值
set_metrology_object_param (MetrologyHandle, Index, 'measure_threshold', RuleThd)
*边缘选择
set_metrology_object_param (MetrologyHandle, Index, 'measure_select',RuleSeleP)
*过度方式
set_metrology_object_param (MetrologyHandle, Index, 'measure_transition', RuleMode)
*对图像进行测量
apply_metrology_model (Image, MetrologyHandle)
*测量圆
get_metrology_object_result (MetrologyHandle, Index, 'all', 'result_type', ['row_begin', 'column_begin', 'row_end', 'column_end'], Parameter)
if (|Parameter|=4)
    *获取多个找边缘点矩形小轮廓和边缘点
    get_metrology_object_measures (Contours, MetrologyHandle, Index, RuleMode, PointRows, PointCols)
    *边缘点的十字标
    gen_cross_contour_xld (Cross, PointRows, PointCols, 5, 0)
    *拟合的圆轮廓
    gen_contour_polygon_xld (ContLine, [Parameter[0],Parameter[2]], [Parameter[1],Parameter[3]])
    *生成直线的中心及角度
    centerRow:=(Parameter[0]+Parameter[2])/2
    centerCol:=(Parameter[1]+Parameter[3])/2
    angle_lx (Parameter[0], Parameter[1], Parameter[2], Parameter[3], Angle)
endif
*测量点

clear_metrology_model (MetrologyHandle)
新版直线测量

 

set_system ('clip_region', 'false')

tuple_length (Row, Length)

*圆测量
create_metrology_model (MetrologyHandle)
add_metrology_object_circle_measure (MetrologyHandle, Row, Column, Radius, RuleWidth, RuleHeight, 1, RuleThd, ['min_score'], [0.35], Index)
*搜索间隔 int
set_metrology_object_param (MetrologyHandle, 'all', 'measure_distance', RuleSpace)
*边缘选择 first last
set_metrology_object_param (MetrologyHandle, 'all', 'measure_select',RuleSeleP)
*过度方式 positive negative
set_metrology_object_param (MetrologyHandle, 'all', 'measure_transition', RuleMode)
*对图像进行测量
apply_metrology_model (Image, MetrologyHandle)

*测量圆
Parameter:=[]
gen_empty_obj (Contours)
gen_empty_obj (Cross)
gen_empty_obj (CrossCenter)
gen_empty_obj (ContCircle)
get_metrology_object_result (MetrologyHandle, Index, 'all', 'result_type', ['row', 'column', 'radius'], Parameter)
if (|Parameter|>=3)
    for Index2 := 0 to Length-1 by 1
        *获取多个找圆矩形小轮廓和边缘点
        get_metrology_object_measures (tempContours, MetrologyHandle, Index2, 'all', PointRows, PointCols)
        *边缘点的十字标
        gen_cross_contour_xld (tempCross, PointRows, PointCols, 5, 0)
        *圆心的十字标
        gen_cross_contour_xld (tempCrossCenter, Parameter[Index2*3+0], Parameter[Index2*3+1], 50, rad(45))
        *拟合的圆轮廓
        gen_circle_contour_xld (tempContCircle, Parameter[Index2*3+0], Parameter[Index2*3+1], Parameter[Index2*3+2], 0, 6.28318, 'positive', 1)
        concat_obj (tempContours, Contours, Contours)
        concat_obj (tempCross, Cross, Cross)
        concat_obj (tempCrossCenter, CrossCenter, CrossCenter)
        concat_obj (tempContCircle, ContCircle, ContCircle)
    endfor
else
    for Index1 := 0 to Length-1 by 1
        *获取多个找圆矩形小轮廓和边缘点
        get_metrology_object_measures (tempContours, MetrologyHandle, Index1, 'all', PointRows, PointCols)
        *边缘点的十字标
        gen_cross_contour_xld (tempCross, PointRows, PointCols, 5, 0)
        *最小二乘法拟合圆
        FitCircle(PointRows, PointCols,tempParameter)
        if (|tempParameter|=3)
            *圆心的十字标
            gen_cross_contour_xld (tempCrossCenter, tempParameter[0], tempParameter[1], 50, rad(45))
            *拟合的圆轮廓
            gen_circle_contour_xld (tempContCircle, tempParameter[0], tempParameter[1], tempParameter[2], 0, 6.28318, 'positive', 1)
        endif
        concat_obj (tempContours, Contours, Contours)
        concat_obj (tempCross, Cross, Cross)
        concat_obj (tempContCircle, ContCircle, ContCircle)
        tuple_concat (tempParameter, Parameter, Parameter)
    endfor
endif
*测量点

clear_metrology_model (MetrologyHandle)
圆测量
Parameter[0]:=-999.999
Parameter[1]:=-999.999
if (|RowList|<=3 or |ColList|<=3 or |RowList|!=|ColList|)
    return()
endif
sum_x := 0.0
sum_y := 0.0
sum_x2 := 0.0
sum_y2 := 0.0
sum_x3 := 0.0
sum_y3 := 0.0
sum_xy := 0.0
sum_x1y2 := 0.0
sum_x2y1 := 0.0
tuple_length(ColList,N)
for i := 0 to N-1 by 1
    assign (RowList[i], x)
    assign (ColList[i], y)
    assign (x*x, x2)
    assign (y*y, y2)
    assign (sum_x+x, sum_x)
    assign (sum_y+y, sum_y)
    assign (sum_x2+x2, sum_x2)
    assign (sum_y2+y2, sum_y2)
    assign (sum_x3+x2*x, sum_x3)
    assign (sum_y3+y2*y, sum_y3)
    assign (sum_xy+x*y, sum_xy)
    assign (sum_x1y2+x*y2, sum_x1y2)
    assign (sum_x2y1+x2*y, sum_x2y1)
endfor
C:=0
D:=0
E:=0
G:=0
H:=0
a:=0
b:=0
c:=0
C:=N * sum_x2 - sum_x * sum_x
D:= N * sum_xy - sum_x * sum_y
E:= N * sum_x3 + N * sum_x1y2 - (sum_x2 + sum_y2) * sum_x
G:= N * sum_y2 - sum_y * sum_y
H:= N * sum_x2y1 + N * sum_y3 - (sum_x2 + sum_y2) * sum_y
a:= (H * D - E * G) / (C * G - D * D)
b:= (H * C - E * D) / (D * D - G * C)
c:= -(a * sum_x + b * sum_y + sum_x2 + sum_y2) / N
Parameter[0]:=a/(-2)
Parameter[1]:=b/(-2)
Parameter[2]:=sqrt(a * a + b * b - 4 * c)/2
圆测量中的FitCircle