* Measure 05 : Code generated by Measure 05
* 利用测量工具实现
* 1 采集图像
dev_close_window ( )
read_image ( Image, 'D:/Halcon_Study/gongjian.BMP' )
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' )
AmplitudeThreshold : = 40
RoiWidthLen2 : = 28.5
set_system ( 'int_zooming' , 'true' )
* Measure 05 : Coordinates for line Measure 05 [ 0 ]
LineRowStart_Measure_05_0 : = 263.191
LineColumnStart_Measure_05_0 : = 63.9394
LineRowEnd_Measure_05_0 : = 283.792
LineColumnEnd_Measure_05_0 : = 1036.39
* Measure 05 : Convert coordinates to rectangle2 type
TmpCtrl_Row : = 0.5 * ( LineRowStart_Measure_05_0+ LineRowEnd_Measure_05_0)
TmpCtrl_Column : = 0.5 * ( LineColumnStart_Measure_05_0+ LineColumnEnd_Measure_05_0)
TmpCtrl_Dr : = LineRowStart_Measure_05_0- LineRowEnd_Measure_05_0
TmpCtrl_Dc : = LineColumnEnd_Measure_05_0- LineColumnStart_Measure_05_0
TmpCtrl_Phi : = atan2 ( TmpCtrl_Dr, TmpCtrl_Dc)
TmpCtrl_Len1 : = 0.5 * sqrt ( TmpCtrl_Dr* TmpCtrl_Dr + TmpCtrl_Dc* TmpCtrl_Dc)
TmpCtrl_Len2 : = RoiWidthLen2
* Measure 05 : Create measure for line Measure 05 [ 0 ]
* Measure 05 : Attention: This assumes all images have the same size!
gen_measure_rectangle2 ( TmpCtrl_Row, TmpCtrl_Column, TmpCtrl_Phi, TmpCtrl_Len1, TmpCtrl_Len2, 1280 , 960 , 'nearest_neighbor' , MsrHandle_Measure_05_0)
* Measure 05 : Coordinates for line Measure 05 [ 1 ]
LineRowStart_Measure_05_1 : = 164.307
LineColumnStart_Measure_05_1 : = 529.66
LineRowEnd_Measure_05_1 : = 559.843
LineColumnEnd_Measure_05_1 : = 506.228
* Measure 05 : Convert coordinates to rectangle2 type
TmpCtrl_Row : = 0.5 * ( LineRowStart_Measure_05_1+ LineRowEnd_Measure_05_1)
TmpCtrl_Column : = 0.5 * ( LineColumnStart_Measure_05_1+ LineColumnEnd_Measure_05_1)
TmpCtrl_Dr : = LineRowStart_Measure_05_1- LineRowEnd_Measure_05_1
TmpCtrl_Dc : = LineColumnEnd_Measure_05_1- LineColumnStart_Measure_05_1
TmpCtrl_Phi : = atan2 ( TmpCtrl_Dr, TmpCtrl_Dc)
TmpCtrl_Len1 : = 0.5 * sqrt ( TmpCtrl_Dr* TmpCtrl_Dr + TmpCtrl_Dc* TmpCtrl_Dc)
TmpCtrl_Len2 : = RoiWidthLen2
* Measure 05 : Create measure for line Measure 05 [ 1 ]
* Measure 05 : Attention: This assumes all images have the same size!
gen_measure_rectangle2 ( TmpCtrl_Row, TmpCtrl_Column, TmpCtrl_Phi, TmpCtrl_Len1, TmpCtrl_Len2, 1280 , 960 , 'nearest_neighbor' , MsrHandle_Measure_05_1)
* Measure 05 : Coordinates for line Measure 05 [ 2 ]
LineRowStart_Measure_05_2 : = 364.135
LineColumnStart_Measure_05_2 : = 664.397
LineRowEnd_Measure_05_2 : = 380.616
LineColumnEnd_Measure_05_2 : = 892.864
* Measure 05 : Convert coordinates to rectangle2 type
TmpCtrl_Row : = 0.5 * ( LineRowStart_Measure_05_2+ LineRowEnd_Measure_05_2)
TmpCtrl_Column : = 0.5 * ( LineColumnStart_Measure_05_2+ LineColumnEnd_Measure_05_2)
TmpCtrl_Dr : = LineRowStart_Measure_05_2- LineRowEnd_Measure_05_2
TmpCtrl_Dc : = LineColumnEnd_Measure_05_2- LineColumnStart_Measure_05_2
TmpCtrl_Phi : = atan2 ( TmpCtrl_Dr, TmpCtrl_Dc)
TmpCtrl_Len1 : = 0.5 * sqrt ( TmpCtrl_Dr* TmpCtrl_Dr + TmpCtrl_Dc* TmpCtrl_Dc)
TmpCtrl_Len2 : = RoiWidthLen2
* Measure 05 : Create measure for line Measure 05 [ 2 ]
* Measure 05 : Attention: This assumes all images have the same size!
gen_measure_rectangle2 ( TmpCtrl_Row, TmpCtrl_Column, TmpCtrl_Phi, TmpCtrl_Len1, TmpCtrl_Len2, 1280 , 960 , 'nearest_neighbor' , MsrHandle_Measure_05_2)
* Measure 05 : * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Measure 05 : * The code which follows is to be executed once / measurement *
* Measure 05 : * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Measure 05 : The image is assumed to be made available in the
* Measure 05 : variable last displayed in the graphics window
copy_obj ( Image, Image, 1 , 1 )
* Measure 05 : Execute measurements
measure_pairs ( Image, MsrHandle_Measure_05_0, 1 , 40 , 'all' , 'all' , Row1_Measure_05_0, Column1_Measure_05_0, Amplitude1_Measure_05_0, Row2_Measure_05_0, Column2_Measure_05_0, Amplitude2_Measure_05_0, Width_Measure_05_0, Distance_Measure_05_0)
measure_pairs ( Image, MsrHandle_Measure_05_1, 1 , 40 , 'all' , 'all' , Row1_Measure_05_1, Column1_Measure_05_1, Amplitude1_Measure_05_1, Row2_Measure_05_1, Column2_Measure_05_1, Amplitude2_Measure_05_1, Width_Measure_05_1, Distance_Measure_05_1)
measure_pairs ( Image, MsrHandle_Measure_05_2, 1 , 40 , 'all' , 'all' , Row1_Measure_05_2, Column1_Measure_05_2, Amplitude1_Measure_05_2, Row2_Measure_05_2, Column2_Measure_05_2, Amplitude2_Measure_05_2, Width_Measure_05_2, Distance_Measure_05_2)
* Measure 05 : Do something with the results
* Measure 05 : Clear measure when done
disp_line ( WindowHandle, Row1_Measure_05_0, Column1_Measure_05_0, Row2_Measure_05_0, Column2_Measure_05_0)
* 当前图形窗口右键菜单设置:
* 图形窗口右键菜单设置结束
disp_line ( WindowHandle, Row1_Measure_05_1, Column1_Measure_05_1, Row2_Measure_05_1, Column2_Measure_05_1)
disp_line ( WindowHandle, Row1_Measure_05_2, Column1_Measure_05_2, Row2_Measure_05_2, Column2_Measure_05_2)
m_width1: = Column2_Measure_05_0- Column1_Measure_05_0
m_width2: = Row2_Measure_05_1- Row1_Measure_05_1
m_width3: = Column2_Measure_05_2- Column1_Measure_05_2
disp_message ( WindowHandle, '长 ' + m_width1, 'image' , 0 , 0 , 'red' , 'false' )
disp_message ( WindowHandle, ' 宽 ' + m_width2, 'image' , 100 , 0 , 'red' , 'false' )
disp_message ( WindowHandle, '直径 ' + m_width3, 'image' , 200 , 0 , 'red' , 'false' )
close_measure ( MsrHandle_Measure_05_0)
close_measure ( MsrHandle_Measure_05_1)
close_measure ( MsrHandle_Measure_05_2)
* 识别拟合求距离
rgb1_to_gray ( Image, Imagegray)
* 2 预处理(定位)
dev_set_draw ( 'fill' )
* threshold ( Imagegray, Region, 100 , 255 )
threshold ( Imagegray, Regions, 0 , 114 )
connection ( Regions, Regionsconnect)
select_shape ( Regionsconnect, SelectedRegions, 'area' , 'and' , 207798 , 275688 )
area_center ( SelectedRegions, AreaRegion, RowCenterRegion, ColumnCenterRegion)
orientation_region ( SelectedRegions, OrientationRegion)
dev_display ( SelectedRegions)
dev_display ( Image)
disp_message ( WindowHandle, 'Center Row: ' + RowCenterRegion$'.5' , 'window' , 20 , 10 , 'blue' , 'false' )
disp_message ( WindowHandle, 'Area: ' + AreaRegion + ' pixel' , 'window' , 20 , 300 , 'blue' , 'false' )
disp_message ( WindowHandle, 'Center Column: ' + ColumnCenterRegion$'.5' , 'window' , 60 , 10 , 'blue' , 'false' )
disp_message ( WindowHandle, 'Orientation: ' + OrientationRegion$'.3' + ' rad' , 'window' , 60 , 300 , 'blue' , 'false' )
disp_cross ( WindowHandle, RowCenterRegion, ColumnCenterRegion, 15 , 0 )
disp_arrow ( WindowHandle, RowCenterRegion, ColumnCenterRegion, RowCenterRegion - 60 * sin ( OrientationRegion) , ColumnCenterRegion + 60 * cos ( OrientationRegion) , 2 )
* reduce_domain ( Imagegray, SelectedRegions, ImageReduced)
* select_shape_std ( ConnectedRegions, RectangleRegions, 'rectangle2' , 80 )
* intersection_lines
* 3 提取边缘
edges_sub_pix ( Imagegray, Edges, 'canny' , 0.6 , 20 , 40 )
select_shape_xld ( Edges, SelectedXLD, [ 'height' , 'width' ] , 'and' , [ 100 , 600 ] , [ 500 , 1000 ] )
* 分割轮廓
segment_contours_xld ( SelectedXLD, ContoursSplit, 'lines_circles' , 5 , 4 , 2 )
dev_set_colored ( 12 )
* dev_open_window ( 0 , 0 , ( 936 - 96 ) , ( 590 - 162 ) , 'black' , WindowHandleZoom)
* dev_set_part ( 96 , 162 , 936 , 590 )
select_shape_xld ( ContoursSplit, SelectedXLD1, [ 'height' , 'width' ] , 'and' , [ 200 , 0 ] , [ 400 , 30 ] )
sort_contours_xld ( SelectedXLD1, SortedContour1, 'character' , 'true' , 'row' )
fit_line_contour_xld ( SortedContour1, 'tukey' , - 1 , 0 , 5 , 2 , RowBegin0, ColBegin0, RowEnd0, ColEnd0, Nr, Nc, Dist)
gen_contour_polygon_xld ( line1, [ RowBegin0[ 0 ] , RowEnd0[ 0 ] ] , [ ColBegin0[ 0 ] , ColEnd0[ 0 ] ] )
gen_contour_polygon_xld ( line2, [ RowBegin0[ 1 ] , RowEnd0[ 1 ] ] , [ ColBegin0[ 1 ] , ColEnd0[ 1 ] ] )
* dev_display ( Image)
* disp_line ( WindowHandle, RowBegin[ 0 ] , ColBegin[ 0 ] , RowEnd[ 0 ] , ColEnd[ 0 ] )
select_shape_xld ( ContoursSplit, SelectedXLD1_2, [ 'height' , 'width' ] , 'and' , [ 0 , 600 ] , [ 50 , 1000 ] )
sort_contours_xld ( SelectedXLD1_2, SortedContour2, 'character' , 'true' , 'row' )
fit_line_contour_xld ( SortedContour2, 'tukey' , - 1 , 0 , 5 , 2 , RowBegin1, ColBegin1, RowEnd1, ColEnd1, Nr1, Nc1, Dist1)
gen_contour_polygon_xld ( line3, [ RowBegin1[ 0 ] , RowEnd1[ 0 ] ] , [ ColBegin1[ 0 ] , ColEnd1[ 0 ] ] )
gen_contour_polygon_xld ( line4, [ RowBegin1[ 1 ] , RowEnd1[ 1 ] ] , [ ColBegin1[ 1 ] , ColEnd1[ 1 ] ] )
distance_pl ( RowBegin0[ 0 ] , ColBegin0[ 0 ] , RowBegin0[ 1 ] , ColBegin0[ 1 ] , RowEnd0[ 1 ] , ColEnd0[ 1 ] , Distance1)
disp_message ( WindowHandle, '竖直边的距离 ' + Distance1, 'window' , 300 , 10 , 'blue' , 'false' )
distance_pl ( RowBegin1[ 0 ] , ColBegin1[ 0 ] , RowBegin1[ 1 ] , ColBegin1[ 1 ] , RowEnd1[ 1 ] , ColEnd1[ 1 ] , Distance1)
disp_message ( WindowHandle, '水平边的距离 ' + Distance1, 'window' , 360 , 10 , 'blue' , 'false' )
edges_sub_pix ( Imagegray, Edges3, 'canny' , 1 , 20 , 30 )
* select_shape_xld ( Edges3, SelectedXLD2, 'width' , 'and' , 34.86 , 640.37 )
select_shape_xld ( Edges3, SelectedXLD2, [ 'width' , 'circularity' ] , 'and' , [ 34.86 , 0.12752 ] , [ 640.37 , 1 ] )
* select_shape_xld ( Edges3, SelectedXLD3, [ 'width' , 'circularity' ] , 'and' , [ 0 , 0.35 ] , [ 120 , 0.5 ] )
union_cocircular_contours_xld ( SelectedXLD2, UnionContours, 1.6 , 0.9 , 0.9 , 30 , 40 , 40 , 'true' , 1 )
fit_circle_contour_xld ( UnionContours, 'algebraic' , - 1 , 0 , 0 , 3 , 2 , Row1, Column1, Radius1, StartPhi1, EndPhi1, PointOrder1)
gen_circle_contour_xld ( ContCircle1, Row1, Column1, Radius1, 0 , 6.28318 , 'positive' , 1 )
distance_pl ( Row1, Column1, RowBegin0[ 0 ] , ColBegin0[ 0 ] , RowEnd0[ 0 ] , ColEnd0[ 0 ] , DistanceR_left)
disp_message ( WindowHandle, '圆心到左边直线的距离 ' + DistanceR_left+ '半径' + Radius1, 'window' , 400 , 10 , 'blue' , 'false' )
distance_pp ( Row1, Column1, RowEnd1[ 0 ] , ColEnd1[ 0 ] , DistanceR_upendpoint)
angle_ll ( RowBegin0[ 1 ] , ColBegin0[ 1 ] , RowEnd0[ 1 ] , ColEnd0[ 1 ] , RowBegin1[ 0 ] , ColBegin1[ 0 ] , RowEnd1[ 0 ] , ColEnd1[ 0 ] , m_angle)
disp_message ( WindowHandle, '圆心到上边直线末尾点(左边点)的距离 ' + DistanceR_upendpoint+ '半径' + Radius1, 'window' , 460 , 10 , 'blue' , 'false' )