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() 함수 인자에 stats와 centroids가 추가된 형태입니다. 보통 stats와 centroids 인자에는 Mat 자료형 변수를 지정합니다. 그러므로 입력 영상 src가 있을 때 connectedComponentsWithStats() 함수를 이용하여 레이블링을 수행하려면 다음과 같이 코드를 작성합니다.
Mat labels, stats, centroids;
connectedComponentsWithStats(src, labels, stats, centroids);