锯片检测示例

1.锯片检测

1.1 应用示例目的与思路

(1) 提取并筛选锯齿的轮廓;

(2) 对筛选后的锯齿轮廓进行直线拟合;

(3) 统计正常锯齿的角度和缺陷锯齿的个数。

1.2 应用示例相关算子介绍

(1) threshold_sub_pix(Image : Border : Threshold : )

功能:以亚像素精度提取图像中的分割线。

图形输入参数:Image:输入图像;

图形输出参数:Border:提取到的XLD轮廓;

控制输入参数:Threshold:阈值。

(2) segment_contours_xld(Contours : ContoursSplit : Mode, SmoothCont, MaxLineDist1, MaxLineDist2 : )

功能:将XLD轮廓分割为线段和圆弧或椭圆弧。

图形输入参数:Contours:输入轮廓;

图形输出参数:ContoursSplit:分割后的轮廓;

控制输入参数1:Mode:轮廓分割模式,Default value: 'lines_circles';

控制输入参数2:SmoothCont:用于平滑轮廓点的个数;

控制输入参数3:MaxLineDist1:轮廓和近似线之间的最大距离(第一次迭代);

控制输入参数4:MaxLineDist2:轮廓和近似线之间的最大距离(第二次迭代)。

(3) union_adjacent_contours_xld(Contours : UnionContours : MaxDistAbs, MaxDistRel, Mode : )

功能:合并相邻的轮廓。

图形输入参数:Contours:输入轮廓;

图形输出参数:UnionContours:合并后的轮廓;

控制输入参数1:MaxDistAbs:相邻轮廓端点的最大距离;

控制输入参数2:MaxDistRel:相邻轮廓端点相对于较长轮廓长度的最大距离,Default value: 1.0;

控制输入参数3:Mode:描述轮廓属性处理的模式。

(4) get_contour_global_attrib_xld(Contour : : Name : Attrib)

功能:返回XLD轮廓的全局属性值。

图形输入参数:Contours:输入轮廓;

控制输入参数:Name:属性名;

控制输出参数:Attrib:属性值。

(5) sort_contours_xld(Contours : SortedContours : SortMode, Order, RowOrCol : )

功能:根据轮廓的相对位置对轮廓进行排序。

图形输入参数:Contours:输入轮廓;

图形输出参数:SortedContours:排序后的轮廓;

控制输入参数1:SortMode:排序模式;

控制输入参数2:Order:升序或降序排列;

控制输入参数3:RowOrCol:排序条件。 'row':按行坐标对轮廓进行排序,如果行坐标相同,则按列坐标对轮廓进行排序。

(6) fit_line_contour_xld(Contours : : Algorithm, MaxNumPoints, ClippingEndPoints, Iterations, ClippingFactor : RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)

功能:通过线段近似XLD轮廓(拟合直线)。

图形输入参数:Contours:输入轮廓;

控制输入参数1:Algorithm:直线拟合的算法;

控制输入参数2:MaxNumPoints:用于计算的最大轮廓点数(所有点为-1),

Default value: -1;

控制输入参数3:ClippingEndPoints:拟合要忽略的等高线起点和终点的点数,Default value: 0;

控制输入参数4:Iterations:最大迭代次数;

控制输入参数5:ClippingFactor:用于消除异常值的剪裁因子(典型值:Huber和Drop为1.0,Tukey为2.0),Default value: 2.0;

控制输出参数1:(RowBegin, ColBegin):直线起点坐标;

控制输出参数2:(RowEnd, ColEnd):直线终点坐标;

控制输出参数3:(Nr, Nc):法向量坐标;

控制输出参数4:Dist:原点到直线的距离。

(7) line_orientation( : : RowBegin, ColBegin, RowEnd, ColEnd : Phi)

功能:计算直线的方向角度。

控制输入参数1:(RowBegin, ColBegin):直线起点坐标;

控制输入参数2:(RowEnd, ColEnd):直线终点坐标;

控制输出参数3:Phi:直线的方向角度。

(8) set_tposition( : : WindowHandle, Row, Column : )

功能:设置文本光标的位置。

控制输入参数1:WindowHandle:窗口句柄;

控制输入参数2:(Row, Column):文本光标的位置。

(9) write_string( : : WindowHandle, String : )

功能:从输出窗口的当前光标位置开始打印文本。

控制输入参数1:WindowHandle:窗口句柄;

控制输入参数2:String:待打印的字符串。

1.3 应用示例示例代码


*读取图片
read_image (Image, './saw_blade.png')
*获取图片的宽和高
get_image_size(Image, Width, Height)
*提取锯片图像的亚像素精度的轮廓
threshold_sub_pix (Image, Border, 128)
*将XLD轮廓分割为线段和圆弧或椭圆弧。
segment_contours_xld (Border, ContoursSplit1, 'lines_circles', 5, 4, 2)
union_adjacent_contours_xld (ContoursSplit1, UnionContours1, 0.1, 0.1, 'attr_keep')
*筛选处锯齿的轮廓
select_shape_xld (UnionContours1, SelectedContours1, 'contlength', 'and', 550, 1000)
*将XLD轮廓分割为线段和圆弧或椭圆弧
segment_contours_xld (SelectedContours1, ContoursSplit2, 'lines_circles', 5, 4, 2)
*去除锯齿间空隙处的圆弧
count_obj (ContoursSplit2, Number1)
gen_empty_obj(ToothSides)
count_circle_arcs:=0

for index1 :=1 to Number1 by 1
    select_obj (ContoursSplit2, SelectedContour1, index1)
    get_contour_global_attrib_xld (SelectedContour1, 'cont_approx', Attrib)
    if(Attrib==-1)  //线段:Attrib=-1;
        concat_obj (ToothSides, SelectedContour1, ToothSides)
    elseif(Attrib==1) //圆弧:Attrib=1
        count_circle_arcs:=count_circle_arcs+1
    endif  
endfor

sort_contours_xld (ToothSides, ToothSidesSorted, 'upper_left', 'true', 'column')
union_adjacent_contours_xld (ToothSidesSorted, UnionContours2, 0.1, 0.1, 'attr_keep')
length_xld (UnionContours2, Length)
*筛选处锯齿的轮廓
select_shape_xld (UnionContours2, SelectedContours2, 'contlength', 'and', 40, 1000)
count_obj (SelectedContours2, Number2)
Saw_Angle_Tuple:=[]

for index2:=1 to Number2 by 1
    select_obj (SelectedContours2, SelectedContour2, index2)
    segment_contours_xld (SelectedContour2, ContoursSplit3, 'lines_circles', 5, 4, 2)
    fit_line_contour_xld (ContoursSplit3, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
    line_orientation (RowBegin, ColBegin, RowEnd, ColEnd, Phi)
    tuple_deg (Phi, Deg)
    for i := 0 to |Deg|-2 by 1
        if(Deg[i]<0 and Deg[i+1]>0)
            Saw_Angle:= 180.0+Deg[i]-Deg[i+1]
            Saw_Angle_Tuple:=[Saw_Angle_Tuple,Saw_Angle]
        endif     
    endfor     
endfor

tuple_min (Saw_Angle_Tuple, Min_Saw_Angle)
tuple_max (Saw_Angle_Tuple, Max_Saw_Angle)
*关闭窗口
dev_close_window ()
*打开指定窗口的大小
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
dev_display (SelectedContours2)
*字符的显示
set_tposition (WindowHandle, 10, 5)  //设置文本1光标的位置
write_string (WindowHandle, ['锯齿形状缺陷的个数:',count_circle_arcs*2,'个'])
set_tposition (WindowHandle, 30, 5)  //设置文本2光标的位置
write_string (WindowHandle, ['正常锯齿角度的最小值:',Min_Saw_Angle,'°'])
set_tposition (WindowHandle, 50, 5)  //设置文本3光标的位置
write_string (WindowHandle, ['正常锯齿角度的最大值:', Max_Saw_Angle,'°'])

结果展示:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值