더북(TheBook)

앞에 나열된 매크로 정의에서 오른편 주석 부분은 각각의 깊이 표현 매크로 상수와 대응되는 C/C++ 자료형을 나타냅니다.5 예를 들어 Mat 행렬의 깊이가 CV_8U라는 것은 이 행렬의 원소가 unsigned char 자료형을 사용한다는 의미입니다. 만약 행렬 원소를 float 자료형으로 표현하려면 깊이가 CV_32F인 행렬을 사용해야 합니다.

Mat 행렬 원소는 하나의 값을 가질 수도 있고, 또는 여러 개로 구성된 값을 가질 수도 있습니다. Mat 행렬 원소를 구성하는 각각의 값을 채널(channel)이라고 부릅니다. 즉, Mat 행렬은 하나의 채널을 가질 수도 있고, 여러 개의 채널을 가질 수도 있습니다. 이때 하나의 행렬을 구성하는 각 채널은 모두 같은 자료형을 사용해야 합니다. 예를 들어 그레이스케일 영상은 하나의 픽셀이 밝기 정보 하나만 사용하므로 1채널 행렬로 표현합니다. 반면에 트루컬러 영상은 하나의 픽셀이 파란색(B), 녹색(G), 빨간색(R) 세 개의 색상 정보를 가지고 있으므로 3채널 행렬로 표현합니다.

OpenCV에서는 Mat 행렬의 깊이 정보와 채널 수 정보를 합쳐서 Mat 객체의 타입(type)이라고 부릅니다. OpenCV 행렬의 타입은 다음과 같은 형식의 매크로 상수로 표현합니다.

CV_<bit-depth>{U|S|F}C(<number_of_channels>)

즉, Mat 행렬의 깊이 표현 매크로 뒤에 C1, C3 같은 채널 정보가 추가로 붙어 있는 형태입니다. 예를 들어 CV_8UC1 타입은 8비트 unsigned char 자료형을 사용하고 채널이 한 개인 행렬 또는 영상을 의미합니다.6 B, G, R 세 개의 색상 성분을 가지고 있는 컬러 영상은 unsigned char 자료형을 사용하고 세 개의 채널을 가지고 있기 때문에 CV_8UC3 타입입니다. 복소수처럼 두 개의 실수 값을 사용하는 행렬은 CV_32FC2 타입으로 만들 수 있습니다. OpenCV에서 새로운 행렬을 생성할 때에는 행렬의 타입 정보를 명시적으로 지정해야 합니다.

 

5 예외적으로 float16_t는 OpenCV에서 정의한 자료형입니다.

 

6 채널이 한 개인 경우에는 타입 매크로 상수 형식 맨 뒤의 C1을 생략할 수 있습니다. 즉, CV_8UC1 타입은 CV_8U 형태로 간략히 쓸 수 있습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.