使用第一个孔洞的边缘拟合出直线,根据这条直线来生成三个卡尺区域,并且指定边缘对中心范围,更换图像时只需要把画出来的点位仿射过去就可以了,如果物料有产生倾斜的现象,需要对每个卡尺区域单独指定边缘对中心
read_image (Image, 'F:/孔洞尺寸测量/1.bmp')
dev_get_window (WindowHandle)
draw_rake (Regions,WindowHandle , 30, 60, 15, Row1, Column1, Row2, Column2)//画一条直线
list_files ('F:/blob/孔洞尺寸测量', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Is := 0 to |ImageFiles| - 1 by 1
read_image (Image, ImageFiles[Is])
rake (Image, Regions2, 30, 60, 15, 1, 20, 'all', 'max', Row1, Column1, Row2, Column2, ResultRow, ResultColumn)
dev_display (Image)
pts_to_best_line (Line, ResultRow,ResultColumn, 2, Row11, Column11, Row21, Column21)
gen_region_line (RegionLines, Row11-30, Column11, Row21-30, Column21)
gen_region_line (RegionLines2, Row11-30, Column11,Row11+1790, Column11)//第一条直线
gen_region_line (RegionLines1, (Row11+Row21)/2-30,(Column11+Column21)/2,(Row11+Row21)/2+1790,(Column11+Column21)/2)//第二条直线
gen_region_line (RegionLines3, Row21-30, Column21,Row21+1790,Column21)//第三条直线
AmplitudeThreshold := 67//设置最小边缘幅度
RoiWidthLen2 := 25//设置矩形ROI宽的一半
set_system ('int_zooming', 'false')//不懂
LineRowStart_Measure_01_0 := Row11-30
LineColumnStart_Measure_01_0 := Column11//设置第一条线段起始点位置
LineRowEnd_Measure_01_0 := Row11+1800
LineColumnEnd_Measure_01_0 := Column11//设置第一条线段终止点位置
TmpCtrl_Row := 0.5*(LineRowStart_Measure_01_0+LineRowEnd_Measure_01_0)
TmpCtrl_Column := 0.5*(LineColumnStart_Measure_01_0+LineColumnEnd_Measure_01_0)
TmpCtrl_Dr := LineRowStart_Measure_01_0-LineRowEnd_Measure_01_0
TmpCtrl_Dc := LineColumnEnd_Measure_01_0-LineColumnStart_Measure_01_0
TmpCtrl_Phi := atan2(TmpCtrl_Dr, TmpCtrl_Dc)
TmpCtrl_Len1 := 0.5*sqrt(TmpCtrl_Dr*TmpCtrl_Dr + TmpCtrl_Dc*TmpCtrl_Dc)
TmpCtrl_Len2 := RoiWidthLen2//获得第一条直线的矩形ROI
gen_measure_rectangle2 (TmpCtrl_Row, TmpCtrl_Column, TmpCtrl_Phi, TmpCtrl_Len1, TmpCtrl_Len2, 2592, 1944, 'bilinear', MsrHandle_Measure_01_0)
*↑提取垂直于矩形长边的直边
LineRowStart_Measure_01_1 :=(Row11+Row21)/2-30
LineColumnStart_Measure_01_1 := (Column11+Column21)/2
LineRowEnd_Measure_01_1 := (Row11+Row21)/2+1800
LineColumnEnd_Measure_01_1 := (Column11+Column21)/2//设置第二条线段的起始点
TmpCtrl_Row := 0.5*(LineRowStart_Measure_01_1+LineRowEnd_Measure_01_1)
TmpCtrl_Column := 0.5*(LineColumnStart_Measure_01_1+LineColumnEnd_Measure_01_1)
TmpCtrl_Dr := LineRowStart_Measure_01_1-LineRowEnd_Measure_01_1
TmpCtrl_Dc := LineColumnEnd_Measure_01_1-LineColumnStart_Measure_01_1
TmpCtrl_Phi := atan2(TmpCtrl_Dr, TmpCtrl_Dc)
TmpCtrl_Len1 := 0.5*sqrt(TmpCtrl_Dr*TmpCtrl_Dr + TmpCtrl_Dc*TmpCtrl_Dc)
TmpCtrl_Len2 := RoiWidthLen2
gen_measure_rectangle2 (TmpCtrl_Row, TmpCtrl_Column, TmpCtrl_Phi, TmpCtrl_Len1, TmpCtrl_Len2, 2592, 1944, 'bilinear', MsrHandle_Measure_01_1)
LineRowStart_Measure_01_2 :=Row21-30
LineColumnStart_Measure_01_2 := Column21
LineRowEnd_Measure_01_2 := Row21+1800
LineColumnEnd_Measure_01_2 := Column21//设置第三条线段的起始点
TmpCtrl_Row := 0.5*(LineRowStart_Measure_01_2+LineRowEnd_Measure_01_2)
TmpCtrl_Column := 0.5*(LineColumnStart_Measure_01_2+LineColumnEnd_Measure_01_2)
TmpCtrl_Dr := LineRowStart_Measure_01_2-LineRowEnd_Measure_01_2
TmpCtrl_Dc := LineColumnEnd_Measure_01_2-LineColumnStart_Measure_01_2
TmpCtrl_Phi := atan2(TmpCtrl_Dr, TmpCtrl_Dc)
TmpCtrl_Len1 := 0.5*sqrt(TmpCtrl_Dr*TmpCtrl_Dr + TmpCtrl_Dc*TmpCtrl_Dc)
TmpCtrl_Len2 := RoiWidthLen2
gen_measure_rectangle2 (TmpCtrl_Row, TmpCtrl_Column, TmpCtrl_Phi, TmpCtrl_Len1, TmpCtrl_Len2, 2592, 1944, 'bilinear', MsrHandle_Measure_01_2)
FuzzyThreshold := 0.5//设置模糊阈值
create_funct_1d_pairs ([4.91121,22.9162,58.9262,76.9312,160.682,178.687,214.697,232.702,327.674,339.679,371.689,389.694,476.285,494.29,530.3,548.305,633.537,651.542,687.552,705.557,790.632,808.637,844.647,862.652,948.936,966.941,1002.95,1020.96,1111.99,1129.99,1166.01,1184.01,1268.17,1286.17,1322.18,1340.19,1426.47,1444.47,1480.48,1498.49, 1590.74,1608.74, 1644.75,1662.76, 1752.79,1770.79, 1806.8,1824.81], [0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0], TmpCtrl_FunctionPositionPair)
*↑,设置边缘对中心位置,如果物料出现倾斜,每条直线需要单独给出出做出边缘对中心点,如果没有倾斜情况,也可以使用同一边缘对中心数据,适当调整公差
set_fuzzy_measure (MsrHandle_Measure_01_0, 'position_pair', TmpCtrl_FunctionPositionPair)
set_fuzzy_measure (MsrHandle_Measure_01_1, 'position_pair', TmpCtrl_FunctionPositionPair)
set_fuzzy_measure (MsrHandle_Measure_01_2, 'position_pair', TmpCtrl_FunctionPositionPair)
*↑指定直边对模糊函数
fuzzy_measure_pairs (Image, MsrHandle_Measure_01_0, 3, AmplitudeThreshold, 0.5, 'negative', Row1_Measure_01_0, Column1_Measure_01_0, Amplitude1_Measure_01_0, Row2_Measure_01_0, Column2_Measure_01_0, Amplitude2_Measure_01_0, TmpCtrl_RowCenter, TmpCtrl_ColumnCenter, Score_Measure_01_0, Width_Measure_01_0, Distance_Measure_01_0)
fuzzy_measure_pairs (Image, MsrHandle_Measure_01_1, 3, AmplitudeThreshold, 0.5, 'negative', Row1_Measure_01_1, Column1_Measure_01_1, Amplitude1_Measure_01_1, Row2_Measure_01_1, Column2_Measure_01_1, Amplitude2_Measure_01_1, TmpCtrl_RowCenter, TmpCtrl_ColumnCenter, Score_Measure_01_1, Width_Measure_01_1, Distance_Measure_01_1)
fuzzy_measure_pairs (Image, MsrHandle_Measure_01_2, 3, AmplitudeThreshold, 0.5, 'negative', Row1_Measure_01_2, Column1_Measure_01_2, Amplitude1_Measure_01_2, Row2_Measure_01_2, Column2_Measure_01_2, Amplitude2_Measure_01_2, TmpCtrl_RowCenter, TmpCtrl_ColumnCenter, Score_Measure_01_2, Width_Measure_01_2, Distance_Measure_01_2)
*↑提取垂直于矩形长边的直边对
*显示结果
dev_display (Image)
gen_cross_contour_xld (Cross, Row1_Measure_01_0, Column1_Measure_01_0, 20, 0)//垂直于第一个矩形长边的所有直边对的第一个点(直边对,所以有两个点)
gen_cross_contour_xld (Cross1, Row2_Measure_01_0, Column2_Measure_01_0, 20, 0)//垂直于第一个矩形长边的所有直边对的第二个点
gen_cross_contour_xld (Cross2, Row1_Measure_01_1, Column1_Measure_01_1, 20, 0)//垂直于第二个矩形长边的所有直边对的第一个点
gen_cross_contour_xld (Cross3, Row2_Measure_01_1, Column2_Measure_01_1, 20, 0)//垂直于第二个矩形长边的所有直边对的第二个点
gen_cross_contour_xld (Cross4, Row1_Measure_01_2, Column1_Measure_01_2, 20, 0)//垂直于第三个矩形长边的所有直边对的第一个点
gen_cross_contour_xld (Cross5, Row2_Measure_01_2, Column2_Measure_01_2, 20, 0)//垂直于第三个矩形长边的所有直边对的第一个点
dev_get_window (WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
for I := 0 to |Width_Measure_01_0|-1 by 1
if (Width_Measure_01_0[I]>28)
I1:='OK'
I2:='black'
else
I1:='NG'
I2:='red'
endif
disp_message (WindowHandle, [I1+Width_Measure_01_0[I]], 'image',Row2_Measure_01_0[I], Column2_Measure_01_0[I], I2, 'false')
if (Width_Measure_01_1[I]>28)
I1:='OK'
I2:='black'
else
I1:='NG'
I2:='red'
endif
disp_message (WindowHandle, [I1+Width_Measure_01_1[I]], 'image',Row2_Measure_01_1[I], Column2_Measure_01_1[I], I2, 'false')
if (Width_Measure_01_2[I]>28)
I1:='OK'
I2:='black'
else
I1:='NG'
I2:='red'
endif
disp_message (WindowHandle, [I1+Width_Measure_01_2[I]], 'image',Row2_Measure_01_2[I], Column2_Measure_01_2[I], I2, 'false')
endfor
stop ()
endfor