1.BGA封装检测
1.1 应用示例目的与思路
(1) 从输入图像中裁剪出包含BGA区域的图像;
(2) 对BGA区域进行特征筛选,筛选出尺寸和形状均不正常的球形焊点;
(3) 对尺寸和形状不正常的球形焊点分别用圆和交叉线标记出来。
1.2 应用示例相关算子介绍
(1) smallest_rectangle2(Regions : : : Row, Column, Phi, Length1, Length2)
功能:获取一个区域的最小外接矩形(方向任意)。
图形输入参数:Regions:输入区域;
控制输出参数1:(Row, Column):外接矩形的中心坐标;
控制输出参数2:Phi:外接矩形的方向;
控制输出参数3:(Length1, Length2):外接矩形的半径。
(2) crop_rectangle2(Image : ImagePart : Row, Column, Phi, Length1, Length2, AlignToAxis, Interpolation : )
功能:从输入图像中剪切出一个或多个矩形区域。
图形输入参数:Image:输入图像;
图形输出参数:ImagePart:输出图像;
控制输入参数1:(Row, Column):图像裁剪中心坐标;
控制输入参数2:Phi:图像裁剪矩形的方向;
控制输入参数3:(Length1, Length2):图像裁剪矩形的半径。
控制输入参数4:AlignToAxis:确定裁剪的图像部分是否与坐标轴对齐;
控制输入参数5:Interpolation:插值方法。
(3) area_center(Regions : : : Area, Row, Column)
功能:计算输入区域的面积和中心。
图形输入参数:Regions:输入区域;
控制输出参数1:Area:输入区域的面积;
控制输出参数2:(Row, Column):输入区域的中心坐标。
(4) select_shape(Regions : SelectedRegions : Features, Operation, Min, Max : )
功能:根据形状特征筛选区域。
图形输入参数:Regions:输入区域;
图形输出参数:SelectedRegions:筛选的区域;
控制输出参数1:Features:筛选的特征;
控制输出参数2:Operation:特征之间的逻辑运算,每一个(Operation = 'and')或至少一个(Operation = 'or');
控制输出参数3:Min:筛选特征的下限值;
控制输出参数4:Max:筛选特征的上限值。
(5) gen_rectangle2_contour_xld( : Rectangle : Row, Column, Phi, Length1, Length2 : )
功能:创建具有任意方向的一个或多个矩形XLD轮廓。
图形输出参数:Rectangle:输出的矩形轮廓;
控制输入参数1:(Row, Column):矩形的中心坐标;
控制输入参数2:Phi:矩形的方向;
控制输入参数3:(Length1, Length2):矩形的半边长度。
(6) gen_circle_contour_xld( : ContCircle : Row, Column, Radius, StartPhi, EndPhi, PointOrder, Resolution : )
功能:创建一个或多个圆弧或闭合圆。。
图形输出参数:ContCircle:输出的圆弧或闭合圆;
控制输入参数1:(Row, Column):圆弧或闭合圆的中心坐标;
控制输入参数2:Radius:圆弧或闭合圆的半径;
控制输入参数3:(StartPhi, EndPhi):圆弧或闭合圆的起始角度和终止角度;
控制输入参数4:PointOrder:沿着圆或圆弧的点顺序;
控制输入参数5:Resolution:相邻轮廓点之间的距离。
(7) gen_cross_contour_xld( : Cross : Row, Col, Size, Angle : )
功能:为每个输入点(Row,Col)生成十字形状的xld轮廓。
图形输出参数:生成的十字形状的xld轮廓;
控制输入参数1:(Row, Col):输入点的坐标;
控制输入参数2:Size:十字交叉线的长度;
控制输入参数3:Angle:十字交叉线的角度。
1.3 应用示例示例代码
*读取图片
read_image (Image, './bga_14x14_defects.png')
*均值滤波
mean_image (Image, ImageMean, 51, 51)
*动态阈值分割
dyn_threshold (Image, ImageMean, RegionDynThresh, 15, 'dark')
*填充孔洞
fill_up (RegionDynThresh, RegionFillUp)
*获取区域的外接矩形
smallest_rectangle2 (RegionFillUp, Row1, Column1, Phi1, Length1, Length2)
*从输入图像中裁剪处矩形区域图像
crop_rectangle2 (Image, ImagePart1, Row1, Column1, Phi1-rad(0.1), Length1, Length2, 'true', 'constant')
*阈值分割
threshold (ImagePart1, Region, 80, 255)
*连通区域分析
connection (Region, ConnectedRegions)
*填充孔洞
fill_up (ConnectedRegions, RegionFillUp1)
*求区域的面积和中心
area_center (RegionFillUp1, Area2, Row2, Column2)
MinArea:=35
MaxArea:=50
*形状特征筛选(筛选尺寸正常的球形焊点)
select_shape (RegionFillUp1, Balls, ['area','circularity'], 'and', [0.8*MinArea,0.75], [1.2*MaxArea,1.0])
*形状特征筛选(筛选尺寸不正常的球形焊点)
select_shape (Balls, WrongAreaBalls, ['area','area'], 'or', [0,MaxArea], [MinArea,10000])
MaxAnisometry:=1.3
*形状特征筛选(筛选形状不正常的球形焊点)
select_shape (Balls, WrongAnisometryBalls, 'anisometry', 'and' ,MaxAnisometry , 100)
*锡球的布局
BgaLayout:=[0,0,1,1,1,1,1]
*相邻锡球的距离
BallDistRowRef:= 14.32
BallDistColRef:= 14.32
BallsPerRow:=2*|BgaLayout|
BallsPerCol:=2*|BgaLayout|
*BGA模型矩阵初始化为-1
BallMatrixRef:=gen_tuple_const(BallsPerCol*BallsPerCol,-1)
*BGA:x坐标
BallsRowsRef:=[]
*BGA:y坐标
BallsColsRef:=[]
CenterRow:=(BallsPerRow-1)*0.5
CenterCol:=(BallsPerCol-1)*0.5
I:=0
for R:=0 to BallsPerRow-1 by 1
for C:=0 to BallsPerCol-1 by 1
Dist:=max(int(fabs([R-CenterRow,C-CenterCol])))
if(BgaLayout[Dist])
BallMatrixRef[R*BallsPerCol+C]:=I
BallsRowsRef:=[BallsRowsRef,R*BallDistRowRef]
BallsColsRef:=[BallsColsRef,C*BallDistColRef]
I:=I+1
endif
endfor
endfor
*获取左上方第一个锡球的坐标
select_shape (Balls,Balls_Row , 'row', 'and',8,22 )
area_center (Balls_Row, Area3, Row3, Column3)
select_shape (Balls,Balls_Col , 'column', 'and',9,25 )
area_center (Balls_Col, Area4, Row4, Column4)
tuple_mean (Row3, Row3_Mean)
tuple_mean (Column4, Column4_Mean)
RectangleSize:=12
gen_rectangle2_contour_xld (Matrix,BallsRowsRef+Row3_Mean,BallsColsRef+Column4_Mean,gen_tuple_const(|BallsRowsRef|,0),gen_tuple_const(|BallsRowsRef|,RectangleSize/2.0),gen_tuple_const(|BallsRowsRef|,RectangleSize/2.0))
dev_display(Matrix)
concat_obj (Matrix, Region, ObjectsConcat)
*将尺寸不正常的球形焊点用圆圈标识出来
area_center (WrongAreaBalls, Area5, Row5, Column5)
gen_circle_contour_xld (ContCircle, Row5, Column5, gen_tuple_const(|Row5|,6), gen_tuple_const(|Row5|,0), gen_tuple_const(|Row5|,6.28), 'positive', 1)
concat_obj (ImagePart1, ContCircle, ObjectsConcat1)
*将形状形状不正常的球形焊点用叉叉标识出来
area_center (WrongAnisometryBalls, Area6, Row6, Column6)
gen_cross_contour_xld (Cross, Row6, Column6, 6, gen_tuple_const(|Row6|,0.785))
concat_obj (ImagePart1, Cross, ObjectsConcat2)
concat_obj (ObjectsConcat1, ObjectsConcat2, ObjectsConcat3)
结果展示: