Mat 클래스에 대해 알아보겠습니다.
OpenCV에서 많이 사용되는 클래스 Mat은, 이미지를 행렬(Matrix)의 형태로 표현합니다.
![](https://3001ssw.com/wp-content/uploads/2023/08/Cap-2020-12-16-22-01-23-515-min.png)
2차원 행렬뿐만 아니라 고차원 행렬로 표현 가능하며, 여러 가지 자료형으로 표현 가능합니다.
OpenCV에서는 Mat 클래스를 사용하여 이미지를 행렬의 형태로 저장합니다.
- Mat::rows : 행렬의 행 갯수
- Mat::cols : 행렬의 열 갯수
3차원에서 rows와 cols는 -1로 저장됩니다.
3차원에서는 크기는 size 멤버 변수로 확인합니다.
- Mat::size : 행렬의 크기
- Mat::dims : 행렬의 차원
- Mat::data : 행렬의 원소의 메모리 공간 가리키는 포인터(없으면 NULL)
Mat 클래스는 unsigned char, signed char, unsigned short, signed short, int, float, double 자료형을 지원합니다.
사용하는 자료형을 깊이(depth)라고 부릅니다.
Mat 클래스를 생성할때 아래와 같이 깊이와 채널정보가 필요합니다. 상수를 표시하는 방식은 아래와 같습니다.
CV_(Bit Depth)(U or S or F)C(Channel count)
(Bit Depth)(U or S or F)엔 아래와 같이 입력이 됩니다.
#define CV_8U 0 // uchar
#define CV_8S 1 // schar
#define CV_16U 2 // ushort
#define CV_16S 3 // signed short
#define CV_32S 4 // int
#define CV_32F 5 // float
#define CV_64F 6 // double
#define CV_16F 7 // float16_t
예를 들어 깊이로 CV_16S를 사용하면 signed short 자료형을 사용합니다.
![](https://3001ssw.com/wp-content/uploads/2023/08/Cap-2020-12-16-22-01-23-515-복사본-min.png)
Mat 행렬의 원소는 여러 개로 구성될 수 있습니다.
흑백 영상은 unsigned char(0~255), 하나의 채널로 표현 가능하지만, – CV_8UC1
컬러 영상은 unsigned char(0~255), 3개의 채널(RGB)로 표현 가능합니다. – CV_8UC3
![](https://3001ssw.com/wp-content/uploads/2023/08/Cap-2020-12-16-22-01-23-515-복사본-복사본-min.png)
위 그림에서 R(unsigned char), G(unsigned char), B(unsigned char), 총 3채널 입니다.
짧게 생성과, 초기화에 대해 알아보겠습니다.
// 행, 열, 타입
Mat(int rows, int cols, int type);
// ex
Mat img(600, 400, CV_8UC1);
Size 클래스로도 생성 가능합니다.
// Size, 타입
Mat(Size size, int type);
// ex
Mat img(Size(640, 480), CV_8CU3);
Scalar로 생성과 동시에 초기화 할 수 있습니다.
// 행, 열, 타입, 초기값
Mat(int rows, int cols, int type, const Scalar& s);
//ex
Mat img(320, 320, CV_8UC3, Scalar(0,0,255));
Scalar는 Mat 클래스의 원소를 초기화 할 때 사용됩니다.
// 행, 열, 타입
Mat::zeros(int rows, int cols, int type);
// ex
Mat img = Mat::zeros(500, 400, CV_8UC1);
zeros 함수는 원소를 0으로 초기화합니다.( = Scalar(0) )
간단히 개념과, Mat클래스의 생성, 초기화에 대해 알아봤고 다음 글에서 계속 이어가겠습니다.