
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])

*直线测量 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 ()

*圆测量 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 ()

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