read_image (Image1, ImageFile) read_region (Rectangle, RoiFile) get_image_size (Image1, Width, Height) reduce_domain (Image1, Rectangle, ImageReduced) edges_sub_pix (ImageReduced, Edges, 'canny', 3, 10, 40) select_contours_xld (Edges, SelectedContours1, 'contour_length', 50, 500, -0.5, 0.5) union_adjacent_contours_xld (SelectedContours1, UnionContours, 10, 1, 'attr_keep') select_contours_xld (UnionContours, SelectedContours, 'contour_length', 300, 400, -0.5, 0.5) sort_contours_xld (SelectedContours, SortedContours, 'character', 'true', 'column') fit_circle_contour_xld (SortedContours, 'algebraic', -1, 0, 0, 3, 2, FitRow, FitCol, Radius, StartPhi, EndPhi, PointOrder) if (|FitRow| != 16) throw ('fit circle count != 16, got ' + |FitRow|) endif CircleRadiusTolerance := 15 create_metrology_model (MetrologyHandle) set_metrology_model_image_size (MetrologyHandle, Width, Height) add_metrology_object_circle_measure (MetrologyHandle, FitRow, FitCol, Radius, CircleRadiusTolerance, 5, 1, 30, [], [], MetrologyCircleIndices) set_metrology_object_param (MetrologyHandle, MetrologyCircleIndices, 'num_instances', 1) set_metrology_object_param (MetrologyHandle, MetrologyCircleIndices, 'measure_transition', 'positive') set_metrology_object_param (MetrologyHandle, MetrologyCircleIndices, 'min_score', 0.3) apply_metrology_model (Image1, MetrologyHandle) get_metrology_object_result (MetrologyHandle, MetrologyCircleIndices, 'all', 'result_type', 'all_param', CircleParameter) Sequence := [0:3:|CircleParameter| - 1] MetroRow := CircleParameter[Sequence] MetroCol := CircleParameter[Sequence + 1] if (|MetroRow| != 16) throw ('metrology circle count != 16, got ' + |MetroRow|) endif clear_metrology_model (MetrologyHandle)