영상을 이진화하면 객체와 배경영역을 구분할 수 있다. 하지만 객체인식을 위해선 다시 한번 객체를 구분하고 위치와 크기 등을 분석하는 작업이 필요하다. 이때 사용하는것이 레이블링 이다.

 

* 하나의 객체는 한 개 이상의 인접한 픽셀들로 이루어지며 연결된 픽셀들은 같은 레이블 번호가 할당된다.

* 레이블링에 의해 만들어지는 2차원 정수 행렬은 레이블 맵이라 불린다.

레이블 맵 행렬에서 배경픽셀은 0, 각 객체 픽셀은 고유번호가 할당된다.

* 인전합 픽셀은 연결 관계에 따라 4방향 연결성과 8방향 연결성으로 나뉜다.

* OpenCV 라이브러리 3.0.0 버전부터 관련 함수를 제공한다.

 

int connectedComponents(InputArray image, OutputArray labels, int connectivity = 8, int ltype = CV_32S);

 

image : 입력영상. CV_8UC1 or CV_8SC1. 픽셀값이 0이 아니면 객체로 간주한다. 그러므로 보통 이진화한 영상을 지정한다.

labels : 출력 레이블 맵 행렬

connectivitiy : 연결성. 4 or 8 을 지정할 수 있다.

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

반환값 : 레이블 개수(객체 개수). 0번은 배경을 나타내는 레이블이므로 실제 객체개수는 반환값-1 이다.

image : 입력영상. CV_8UC1 or CV_8SC1. 픽셀값이 0이 아니면 객체로 간주한다. 그러므로 보통 이진화한 영상을 지정한다.

labels : 출력 레이블 맵 행렬

connectivitiy : 연결성. 4 or 8 을 지정할 수 있다.

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

반환값 : 레이블 개수(객체 개수). 0번은 배경을 나타내는 레이블이므로 실제 객체개수는 반환값-1 이다.

 

* 객체 영역의 통계 정보

레이블링을 수행후 반환되는 레이블 맵에는 각 객체영역이 어느 위치에 어느 정도의 크기로 존재하는지에 대한 정보가 없다. 그러므로 OpenCV에서는 레이블맵과 통계 정보를 한꺼번에 반환하는 함수를 제공한다.

 

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

 

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

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

 

stats

* 행 개수는 레이블 개수와 같고 각 행은 레이블 맵의 번호와 매칭된다.(첫 번째 행은 배경 영역 정보)

* 열 개수는 항상 5개이며 각 열은 x 좌표, y 좌표, 가로 크기, 세로 크기, 레이블의 픽셀 개수 정보를 담고있다.

centroid

* 행 개수는 레이블 개수와 같고 각 행은 레이블 맵의 번호와 매칭된다.(첫 번쨰 행은 배경 영역 정보)

* 열 개수는 항상 2개이며 각 열은 레이블의 무게 중심 좌표 (x좌표, y좌표)를 저장한다.

* 무게중심좌표를 구하는 공식은 다음과 같다.

( x, y ) = ( (객체 픽셀의 x좌표를 모두 더한 값) / 픽셀 개수), (객체 픽셀의 y좌표를 모두 더한 값) / 픽셀 개수) )

'공부 > OpenCV' 카테고리의 다른 글

어파인 변환  (0) 2019.07.30
영상의 필터링  (0) 2019.07.19
영상의 연산  (0) 2019.07.19
OpenCV (Open Computer Vision)  (0) 2019.05.29

+ Recent posts