Halcon中的2D Metrology模块提供了亚像素级别的卡尺测量功能。主要针对圆/圆弧、椭圆/椭圆弧、直线、rectangle2矩形创建测量对象。
步骤
一般首次使用2D Metrology测量工具有如下步骤:
- 创建测量模型;使用create_metrology_model();
- 设置测量对象图像的大小;使用set_metrology_model_image_size();
- 提供近似值;将测量对象添加到模型中,同时将测量对象的近似参数和控制测量的参数添加到模型中。
主要通过以下算子实现对应对象的添加:
- add_metrology_object_circle_measure() 将圆或圆弧添加到度量模型中
- add_metrology_object_ellipse_measure() 将椭圆或椭圆弧添加到度量模型中
- add_metrology_object_line_measure() 将直线添加到度量模型中
- add_metrology_object_rectangle2_measure() 将一个矩形添加到度量模型中
- add_metrology_object_generic()创建几个不同几何形状的测量
其中,模型参数的设置也可以通过set_metrology_model_param()完成,如果模型中有多个测量形状需要设置则可以通过 set_metrology_object_param()进行设置。
4.应用测量;使用apply_metrology_model()将测量应用到指定图像中。
5.获取结果;
6.清除内存;使用clear_metrology_model()销毁模型。
测量示例
如图,计算图中元件的中心与缺口角度问题:
read_image (Image, 'uranium_targeting_256.bmp')
try
get_image_size (Image, Width, Height)
auto_threshold (Image, Regions, 5)
fill_up (Regions, RegionFillUp)
select_shape_std (RegionFillUp, SelectedRegions1, 'max_area', 70)
reduce_domain (Image, SelectedRegions1, ImageReduced1)
threshold (ImageReduced1, Region2, 0, 150)
connection (Region2, ConnectedRegions5)
fill_up (ConnectedRegions5, RegionFillUp2)
select_shape_std (RegionFillUp2, SelectedRegions4, 'max_area', 70)
opening_circle (SelectedRegions4, RegionOpening, 10)
gen_contour_region_xld (RegionOpening, Contours, 'border')
fit_circle_contour_xld (Contours, 'atukey', -1, 0, 0, 3, 2, CircleCenterRow, CircleCenterColumn, CircleCenterRadius, StartPhi1, EndPhi1, PointOrder1)
gen_circle_contour_xld (ContCircle1, CircleCenterRow, CircleCenterColumn, CircleCenterRadius, 0, 6.28318, 'positive', 1)
gen_region_contour_xld (Contours, Region3, 'margin')
gen_region_contour_xld (ContCircle1, Region, 'margin')
shape_trans (RegionOpening, RegionTrans, 'rectangle2')
erosion_circle (RegionTrans, RegionErosion, 30)
difference (Region3, RegionErosion, RegionDifference)
connection (RegionDifference, ConnectedRegions4)
select_shape_std (ConnectedRegions4, SelectedRegions3, 'max_area', 70)
dilation_circle (SelectedRegions3, RegionDilation, 5)
skeleton (RegionDilation, Skeleton1)
gen_contours_skeleton_xld (Skeleton1, Contours2, 10, 'filter')
fit_line_contour_xld (Contours2, 'tukey', -1, 0, 5, 2.0, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
gen_region_line (RegionLines, RowBegin, ColBegin, RowEnd, ColEnd)
intersection (RegionLines, Region, RegionIntersection2)
connection (RegionIntersection2, ConnectedRegions1)
* 直线检测的起始点与终止点
area_center (ConnectedRegions1, Area4, LineRegionRow, LineRegionColumn)
**卡尺精定位部分
create_metrology_model (MetrologyHandle)
set_metrology_model_image_size (MetrologyHandle, Width, Height)
add_metrology_object_circle_measure (MetrologyHandle, CircleCenterRow, CircleCenterColumn, CircleCenterRadius, 10, 5, 1.5, 20, ['measure_transition','min_score'], ['positive',0.5], MetrologyCircleIndex)
apply_metrology_model (Image, MetrologyHandle)
get_metrology_object_result (MetrologyHandle, MetrologyCircleIndex, 'all', 'result_type', 'all_param', CircleParameter)
add_metrology_object_line_measure (MetrologyHandle, LineRegionRow[0], LineRegionColumn[0], LineRegionRow[1], LineRegionColumn[1], 10, 5, 1, 20, ['measure_transition','min_score'], ['uniform',0.5], MetrologyLineIndex)
apply_metrology_model (Image, MetrologyHandle)
get_metrology_object_result (MetrologyHandle, MetrologyLineIndex, 'all', 'result_type', 'all_param', LineParameter)
** 显示信息
get_metrology_object_result_contour (MetrologyCircleContour, MetrologyHandle, MetrologyCircleIndex, 'all', 1.5)
get_metrology_object_result_contour (MetrologyLineContour, MetrologyHandle, MetrologyLineIndex, 'all', 1.5)
gen_region_line (RegionLinesH, LineParameter[0], LineParameter[1], LineParameter[2], LineParameter[3])
* *** Output ****
if (LineParameter[1]<LineParameter[3])
angle_lx (LineParameter[0], LineParameter[1], LineParameter[2], LineParameter[3], Angle)
else
angle_lx (LineParameter[2], LineParameter[3], LineParameter[0], LineParameter[1], Angle)
endif
gen_region_line (RegionLinesX, Height/2, 0, Height/2, Width)
gen_region_line (RegionLinesY, 0, Width/2, Height, Width/2)
gen_cross_contour_xld (Cross, CircleParameter[0], CircleParameter[1], 30, 1)
get_metrology_object_measures (Contours1, MetrologyHandle, 'all', 'all', Row2, Column2)
**显示
tuple_rad (180, Rad)
gen_rectangle2 (Rectangle, CircleParameter[0], CircleParameter[1], Angle+Rad/2.0, 1.2*CircleParameter[2], 2)
intersection (Rectangle, RegionLines, RegionIntersection)
area_center (RegionIntersection, Area, Row, Column)
gen_region_line (RegionLines1, CircleParameter[0], CircleParameter[1], Row, Column)
dev_display (Image)
dev_set_line_width (2)
dev_set_color ('red')
dev_display (Cross)
dev_display (MetrologyCircleContour)
dev_set_color ('cyan')
dev_display (MetrologyLineContour)
dev_set_color ('blue')
dev_display (RegionLines1)
disp_arrow (3600, CircleParameter[0], CircleParameter[1], Row, Column, 2)
dev_set_color ('green')
dev_display (Contours1)
dev_set_color ('yellow')
gen_cross_contour_xld (Cross1, Row2, Column2, 6, 0)
disp_arrow (3600, CircleParameter[0], CircleParameter[1], Row, Column, 2)
tuple_deg (Angle + Rad/2.0, Deg)
if (Row>CircleParameter[0])
ReturnDeg := Deg - 180
elseif(Row<CircleParameter[0])
ReturnDeg := Deg
elseif (Row==CircleParameter[0] and Column>CircleParameter[1])
ReturnDeg := 0
elseif (Row==CircleParameter[0] and Column<CircleParameter[1])
ReturnDeg := 180
endif
DRow := CircleParameter[0] - Height/2
DColumn := CircleParameter[1] - Width/2
disp_message (3600, 'DRow := ' + DRow, 'window', 20, 20, 'black', 'true')
disp_message (3600, 'DColumn := ' + DColumn, 'window', 40, 20, 'black', 'true')
disp_message (3600, 'Angle := ' + ReturnDeg, 'window', 60, 20, 'black', 'true')
clear_metrology_model (MetrologyHandle)
stop ()
catch (Exception)
dev_display (Image)
disp_message (3600, Exception, 'window', 20, 20, 'black', 'true')
disp_message (3600, 'NULL', 'window', 20, 20, 'black', 'true')
stop ()
endtry
输出结果: