더북(TheBook)

12.1.2 레이블링 응용

기본적인 레이블링 동작은 입력 영상으로부터 레이블 맵을 생성하는 것입니다. 그러나 보통 레이블링을 수행한 후에는 각각의 객체 영역이 어느 위치에 어느 정도의 크기로 존재하는지 확인할 필요가 있습니다. 이러한 작업을 사용자가 for 반복문 등을 이용하여 직접 구현하기는 꽤 번거롭습니다. 다행히 OpenCV는 레이블 맵과 각 객체 영역의 통계 정보를 한꺼번에 반환하는 connectedComponentsWithStats() 함수를 제공합니다. connectedComponentsWithStats() 함수 원형은 다음과 같습니다.

int connectedComponentsWithStats(InputArray image, OutputArray labels,
                 OutputArray stats, OutputArray centroids,
                 int connectivity = 8, int ltype = CV_32S);

image

입력 영상. CV_8UC1 또는 CV_8SC1

labels

출력 레이블 맵 행렬

stats

각각의 레이블 영역에 대한 통계 정보를 담은 행렬. CV_32S

centroids

각각의 레이블 영역의 무게 중심 좌표 정보를 담은 행렬. CV_64F

connectivity

연결성. 8 또는 4를 지정할 수 있습니다.

ltype

출력 행렬 타입. CV_32S 또는 CV_16S를 지정할 수 있습니다.

반환값

레이블 개수. 반환값이 N이면 0부터 N-1까지의 레이블 번호가 존재하며, 이 중 0번 레이블은 배경을 나타냅니다. 실제 객체 개수는 N-1입니다.

 

connectedComponentsWithStats() 함수의 인자 구성은 connectedComponents() 함수 인자에 statscentroids가 추가된 형태입니다. 보통 statscentroids 인자에는 Mat 자료형 변수를 지정합니다. 그러므로 입력 영상 src가 있을 때 connectedComponentsWithStats() 함수를 이용하여 레이블링을 수행하려면 다음과 같이 코드를 작성합니다.

Mat labels, stats, centroids;
connectedComponentsWithStats(src, labels, stats, centroids);
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.