HALCON을 활용한 BGA 검사 예시

지난 글까지 할콘의 기본 개념과 사용 방법을 다뤘습니다. 이번 글에서 살펴볼 응용 사례는 할콘 Solution Guide의 Practical Guidance에 소개된 Ball Grid Array(BGA)의 검사 입니다. BGA는 매우 작은 객체로 구성되어 있으며, 대략적으로 대칭적인 회색 값 분포 를 가지고 있으며, 객체의 영역에 비해 전경과 배경 사이의 전환 영역이 비교적 클 수 있습니다. 표준 영역 기반 또는 윤곽 기반 접근 방식은 급격한 전환을 처리하는 방식이므로(아래 그림 참고), 전환 영역이 큰 대칭 객체의 경우 회색 값 특성을 고려하는 접근 방식을 사용하여 객체의 특징을 추출하는 것이 권장됩니다. 사용 가능한 연산자로는 각 볼의 회색 값 볼륨과 중심 위치를 확인하는 area_center_gray가 있으며, 입력 영역과 동일한 방향과 종횡비를 가지는 타원의 축 길이 및 방향을 반환하는 elliptic_axis_gray가 있습니다.

BGA 검사란?

BGA는 PCB와 칩을 연결하는 작은 볼 형태의 솔더 접합부를 의미합니다. 검사 시 가장 중요한 항목은 다음과 같습니다.

  • 볼 위치의 정확성
  • 볼의 누락 여부
  • 볼의 변형 여부

특히 일반적인 영역 기반(region-based) 검사 방식보다 회색조(gray-value) 특징을 기반으로 접근해야 더 정확한 결과를 얻을 수 있습니다.

이유: BGA 볼은 작고 대칭적인 구조이며 배경과의 전환부가 뚜렷하지 않아 일반적인 방법으로는 정확히 측정하기 어렵습니다.

검사 방법 절차 요약

단계 주요 작업 HALCON 사용 연산자
1 기준(reference) BGA 볼 추출 및 위치 확인 fast_threshold, connection, select_shape, dilation_rectangle1, area_center_gray
2 기준 BGA 볼 위치 정렬 (그리드 기준 정렬) gen_region_points, smallest_rectangle2, hom_mat2d_identity, hom_mat2d_rotate, hom_mat2d_translate, hom_mat2d_scale, affine_trans_point_2d
3 검사 대상 BGA 볼 추출 및 정렬 (기준 BGA와 동일 방법 적용), 추가적으로 볼 변형 정보 추출 위 연산자에 추가로 elliptic_axis_gray
4 검사 BGA와 기준 BGA 비교 및 검사 vector_to_rigid, affine_trans_point_2d, distance_pp, gen_ellipse

상세 실전 적용 가이드

1단계: 기준 BGA 볼 추출

기준 이미지에서 볼 영역을 다음과 같이 추출합니다.

1
2
3
4
5
fast_threshold (Image, Region, 95, 255, 3)  
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ['area', 'anisometry'], 'and', [20, 1.0], [100, 1.7])
dilation_rectangle1 (SelectedRegions, RegionDilation, 3, 3)
area_center_gray (RegionDilation, Image, Volume, Row, Column)

결과: 각 볼의 위치(Row, Column), 볼의 회색조 볼륨(Volume)을 얻음.


2단계: 기준 BGA 위치 정렬(그리드 정규화)

볼 위치를 정확히 비교하기 위해 그리드 기준으로 정렬하고, 정렬 시 볼 간의 간격을 1로 표준화하여 상대적 위치로 관리합니다(left). gen_region_points로 볼 중심점을 영역으로 만들고 smallest_rectangle2로 외접 사각형을 찾습니다(right). 이 사각형 정보를 통해 좌표를 변환하여 정규화된 좌표를 얻습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
gen_region_points (RegionBGACenters, Row, Column)
smallest_rectangle2 (RegionBGACenters, RowBGARect, ColumnBGARect, PhiBGARect, Length1BGARect, Length2BGARect)
BallsPerRow := 14
BallsPerCol := 14
BallDistCol := 2 * Length1BGARect / (BallsPerCol - 1)
BallDistRow := 2 * Length2BGARect / (BallsPerRow - 1)
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_rotate (HomMat2DIdentity, -PhiBGARect, RowBGARect, ColumnBGARect, HomMat2DRotate)
hom_mat2d_translate (HomMat2DRotate, -RowBGARect + Length2BGARect, -ColumnBGARect + Length1BGARect, HomMat2DTranslate)
hom_mat2d_scale (HomMat2DTranslate, 1 / BallDistRow, 1 / BallDistCol, 0, 0, HomMat2DScale)
affine_trans_point_2d (HomMat2DScale, Row, Column, RowNormalized, ColNormalized)
BGARowIndex := round(RowNormalized)
BGAColIndex := round(ColNormalized)

얻어진 볼의 중심 위치(Row, Column)는 임의의 순서로 반환되며, 즉 변수의 인덱스는 그리드 내에서 해당 볼의 위치에 대한 정보를 포함하지 않습니다. 서로 다른 BGA에서 대응하는 볼의 중심 위치를 비교하려면, 볼들의 일관된 순서가 필요하며, 이를 위해 볼을 공간적으로 정렬해야 합니다. 첫 번째 단계에서는 행과 열에 대해 각각 그리드 내 위치를 결정합니다. 이를 위해 BGA를 다음과 같이 정규화합니다. gen_region_points를 적용하여 볼의 중심점으로 정의된 영역을 생성하고, 해당 영역을 감싸는 사각형(smallest_rectangle2로 획득됨, left)을 사용하여 변환 행렬을 정의합니다.

이를 통해 볼을 변환하여 그리드가 수평이 되도록 정렬하고, 좌측 상단 모서리에 위치한 볼의 중심을 좌표계의 원점에 배치하며, 개별 볼 간의 거리를 1로 조정합니다. 변환된 볼 위치의 값을 반올림하면 정규화된 그리드에서 행과 열에 대한 볼의 위치 인덱스를 나타내게 됩니다. 그림(right)는 시각화를 위해 다시 스케일 조정된 정규화된 그리드를 보여줍니다.

이제 행과 열에 대한 개별 리스트 대신, 볼의 인덱스를 왼쪽에서 오른쪽으로, 위에서 아래로 연속적으로 정렬한 단일 리스트를 생성하려고 합니다. 이를 위해 BGA의 모든 그리드 포인트를 포함할 수 있는 크기의 튜플 BallMatrix를 생성하며, 이 크기는 행과 열에서 최대로 포함될 수 있는 볼의 개수로 정의됩니다. 그러나 실제로 BGA의 볼은 이 전체 그리드에 균일하게 배치되지 않기 때문에, 먼저 모든 인스턴스에 초기값 -1을 할당합니다.

이제, 추출된 볼의 행 및 열 인덱스(BGARowIndex, BGAColIndex)를 활용하여 BallMatrix의 해당 위치에 새로운 값을 할당함으로써 볼을 정렬합니다. 정렬이 완료된 후, 정렬된 그리드에서 특정 좌표의 인덱스를 참조하면 해당 좌표의 원래(정렬 전) 그리드에서의 인덱스를 반환하거나, 해당 위치에 볼이 없을 경우 -1을 반환합니다.

1
2
3
4
5
NumBalls := |Row|
BallMatrix := gen_tuple_const(BallsPerRow * BallsPerCol,-1)
for i := 0 to NumBalls - 1 by 1
BallMatrix[BGARowIndex[i] * BallsPerCol + BGAColIndex[i]] := i
endfor

3단계: 검사 BGA 추출 및 변형 정보 계산

검사 이미지에서 같은 방법으로 볼을 추출하며, 추가로 변형 여부(타원축 길이, 방향 등)를 계산합니다.

1
2
elliptic_axis_gray (RegionDilation, Image, RaCheck, RbCheck, PhiCheck)  
AnisometryCheck := RaCheck / RbCheck

area_center_gray를 통해 얻은 중심점들은 변환된 후, 기준 이미지에서 수행한 것과 동일한 방식으로 정렬됩니다. 기준 BGA와의 처리 과정은 거의 동일하며, 단, 이후 단계에서 볼을 조사하기 위해 elliptic_axis_gray의 추가 적용과 비등방성(Anisometry) 검사가 추가로 수행됩니다. 이때 타원의 Anisometry이 높으면 볼의 변형으로 판단할 수 있습니다.


4단계: 두 BGA 비교 및 최종 검사

검사 대상 BGA와 기준 BGA의 위치 정보를 이용하여 최종적으로 검사합니다. 검사 과정은 아래와 같이 요약할 수 있습니다.

  • 데이터 통합(Row, Col, Anisometry, Volume 등) 튜플 생성
  • 두 BGA의 위치를 일치시키기 위한 변환 행렬 계산 (vector_to_rigid)
  • 변환 행렬을 통해 위치를 맞춤 (affine_trans_point_2d)
  • 두 위치의 거리를 측정하여 오차 범위를 벗어난 볼을 찾아냄 (distance_pp)
  • 볼 간 거리가 기준(0.05 픽셀)을 넘으면 불량 위치로 판단하고, 변형된 볼이나 회색조 볼륨이 비정상적인 볼도 따로 구분합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
j := 0
for i := 0 to BallsPerRow * BallsPerCol - 1 by 1
if (BallMatrix[i] >= 0 and BallMatrixCheck[i] >= 0)
Rows1[j] := Row[BallMatrix[i]]
Cols1[j] := Column[BallMatrix[i]]
Rows2[j] := RowCheck[BallMatrixCheck[i]]
Cols2[j] := ColumnCheck[BallMatrixCheck[i]]
Phi2[j] := PhiCheck[BallMatrixCheck[i]]
Ra2[j] := RaCheck[BallMatrixCheck[i]]
Rb2[j] := RbCheck[BallMatrixCheck[i]]
Anisometry2[j] := AnisometryCheck[BallMatrixCheck[i]]
Volume2[j] := VolumeCheck[BallMatrixCheck[i]]
j := j + 1
endif
endfor

지금까지는 정렬된 그리드의 점 인덱스를 정렬되지 않은 그리드의 점 인덱스와 연결하는 작업만 수행했습니다. 이제, 지정된 순서대로 기존 볼의 실제 데이터를 포함하는 튜플을 생성 합니다. 특히, 기준 BGA에서의 볼의 행 및 열 좌표(Rows1, Cols1)와 검사 대상 BGA에서의 볼의 행 및 열 좌표(Rows2, Cols2), 그리고 두 번째 BGA의 타원 반지름(Ra2, Rb2), 비등방성(Anisometry) 값(Anisometry2), 회색 값 볼륨(Volume2)을 포함하는 튜플이 생성됩니다. 이 튜플들은 데이터를 축소한 형태로, 두 BGA 모두에서 볼이 존재하는 그리드 위치의 데이터만 포함합니다.

이제 두 번째 BGA의 볼 중심 위치를 기준 BGA의 볼 중심 위치와 비교하기 위해, 두 데이터 세트를 겹쳐서 정렬(superimpose)합니다. 즉, 기준 BGA의 볼을 변환하여 검사 대상 BGA의 볼과 동일한 위치, 방향, 스케일을 갖도록 조정 합니다. 이 겹치기 과정에서는 vector_to_rigid를 사용하여 두 좌표 세트 간의 점 대응 관계를 기반으로 2D Affine 변환을 결정합니다.

획득한 변환 행렬을 사용하여 기준 BGA의 축소된 위치 세트(Rows1, Cols1)를 변환하여 RowTransColumnTrans를 생성합니다. 또한, 검사 대상 BGA에서 누락된 볼을 확인하기 위해, area_center_gray를 통해 원래 얻어진 기준 BGA의 정렬되지 않은 위치 세트(Row, Column)를 추가로 변환합니다. 이 세트는 BallMatrix에서 -1로 표시된, 원래 볼이 존재하지 않는 위치뿐만 아니라 기준 BGA에서만 감지된 볼의 위치까지 포함하는 전체 정규 그리드의 모든 위치를 유지하고 있습니다.

1
2
3
4
vector_to_rigid (Rows1, Cols1, Rows2, Cols2, HomMat2D)
affine_trans_point_2d (HomMat2D, Rows1, Cols1, RowTrans, ColumnTrans)
affine_trans_point_2d (HomMat2D, Row, Column, RowTransFull, ColumnTransFull)

그 후, 검사 대상 BGA의 정렬된 점들(Rows2, Cols2)과 기준 BGA의 정렬 및 변환된 점들(RowTrans, ColumnTrans) 간의 거리를 distance_pp 연산자를 사용하여 계산합니다.

1
distance_pp (Rows2, Cols2, RowTrans, ColumnTrans, Distance)

위 거리 계산 후 결과를 다음과 같이 처리합니다.

거리 (픽셀) 처리 내용
> 0.05 위치 이상
≤ 0.05, Anisometry > 1.2 변형된 볼
≤ 0.05, Volume 비정상 회색조 볼륨 이상
그 외 정상 볼

실제 적용 시 유의점

  • 이 글은 할콘 Solution Guide의 Practical Guidance 예시를 참고하여 2d_measuring/inspect_bga.hdev 샘플 코드의 이해를 돕기 위해 작성되었습니다.
  • 실제 검사에 활용하기에는 많은 제약이 있으며, 각 프로시저의 활용법과 접근법등을 익히는 용도로 활용해야합니다.