孔洞尺寸测量:1),分三个区域检测出有问题的间距;2)分别显示出每个区域的尺寸;3)把有问题的尺寸用红色标志显示

使用第一个孔洞的边缘拟合出直线,根据这条直线来生成三个卡尺区域,并且指定边缘对中心范围,更换图像时只需要把画出来的点位仿射过去就可以了,如果物料有产生倾斜的现象,需要对每个卡尺区域单独指定边缘对中心

 

 

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值