n차원 1채널 또는 다채널 행렬 표현을 위한 클래스
다양한 형태의 행렬 생성, 복사, 행렬 연산 기능을 제공
Mat::copyTo() 또는 Mat::clone() 함수 사용<< 연산자 오버로딩을 지원행렬의 원소(픽셀 값) 접근 방법을 제공
| 사용 방법 | 특징 |
|---|---|
Mat::data | 메모리 연산이 잘못될 경우 프로그램이 비정상 종료될 수 있음 |
Mat::at() | 좌표 지정이 직관적. 임의 좌표에 접근할 수 있음 |
Mat::ptr() | Mat::at()보다 빠르게 동작. 행 단위 연산을 수행할 때 유리함 |
MatIterator 반복자 | 좌표를 지정하지 않아서 안전. 성능은 느린 편 |
Mat::data 멤버 변수가 실제 픽셀 데이터 위치를 가리킴
Mat::at<typename>(int y, int x) 또는 Mat::ptr<typename>(int y) 함수 사용을 권장
Mat::depth() 함수를 이용하여 참조CV_<bit-depth>{U|S|F}#define CV_8U 0 // uchar, unsigned char
#define CV_8S 1 // schar, signed char
#define CV_16U 2 // ushort, unsigned short
#define CV_16S 3 // short
#define CV_32S 4 // int
#define CV_32F 5 // float
#define CV_64F 6 // double
#define CV_16F 7 // float16_tMat::channels() 함수를 이용하여 참조Mat::type() 함수를 이용하여 참조CV_8UC1 8비트 unsigned char type을 사용하면서 채널은 1개인 그레이스케일 영상// 정의
Scalar sum(InputArray src);
// 예제 코드
uchar data[] = {1, 2, 3, 4, 5, 6};
Mat mat1(2, 3, CV_8UC1, data);
int sum1 = (int)sum(mat1)[0]; // 21
src: 입력 행렬. 1~4채널.// 정의
Scalar mean(InputArray src, InputArray mask = noArray());
// 예제 코드
Mat img_GRAY = imread("lenna.bmp", IMREAD_GRAYSCALE);
Mat img_COLOR = imread("lenna.bmp");
double mean_GRAY = mean(img_GRAY)[0]; // 124.0
Scalar mean_COLOR = mean(img_COLOR); // [0]: B, [1]: G, [2]: R, [3]: 0
mask: 마스크 영상// 정의
void minMaxLoc(InputArray src, double* minVal, double* Maxval = 0,
Point* minLoc = 0, Point* maxLoc = 0, InputArray mask = noArray());
// 예제 코드
Mat img = imread("lenna.bmp", IMREAD_GRAYSCALE);
double minv, maxv;
Point minLoc, maxLoc;
minMaxLoc(img, &minv, &maxv, &minLoc, &maxLoc); // 25, 245, [508, 71], [116, 273]
src: 입력 영상. 단일 채널.minVal, maxVal: 최솟값/최댓값 변수 포인터. 필요 없으면 NULL 지정.minLoc, maxLoc: 최솟값/최댓값 위치 변수 포인터. 필요 없으면 NULL 지정.mask: 마스크 영상. mask 행렬 값이 0이 아닌 부분에서만 연산을 수행.// 정의
void Mat::convertTo(OutputArray m, int rtype, double alpha=1, double beta=0) const;
// 예제 코드
Mat img = imread("lenna.bmp", IMG_GRAYSCALE);
Mat fimg;
img.converTo(fimg, CV_32FC1);
rtype: 원하는 출력 행렬 타입alpha: 추가적으로 곱할 값beta: 추가적으로 더할 값// 정의
void normalize(InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0,
int norm_type = NROM_L2, int dtype = -1, InputArray mask = noArray());
// 예제 코드
Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);
Mat dst;
normalize(src, dst, 0, 255, NORM_MINMAX);
dst: 출력 행렬. src와 같은 크기.alpha: (노름 정규화인 경우) 목표 노름(norm)값, (NORM_MINMAX인 경우) 최솟값beta: (NORM_MINMAX인 경우) 최댓값norm_type: 정규화 타입. NORM_INF, NORM_L1, NORM_L2, NORM_MINMAX 중 하나를 가짐. NORM_MINMAX를 지정할 경우, 출력 행렬 dst의 최솟값은 alpha, 최댓값은 beta가 되도록 설정함.dtype: 출력 행렬의 타입
// 정의
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0);
// 예제 코드
Mat src = imread("lenna.bmp");
Mat dst;
cvtColor(src, dst, COLOR_BGR2GRAY);
code: 색 변환 코드dstCn: 결과 영상의 채널 수. 0이면 자동으로 결정됨.imread에서 IMREAD_GRAYSCALE로 불러오는 것도 가능하다.// 정의
void split(const Mat& src, Mat* mvbegin);
void split(InputArray src, OutputArrayOfArrays mv);
// 예제 코드
Mat src = imread("lenna.bmp");
vector<Mat> planes;
split(src, planes);
src: (입력) 다채널 행렬mvbegin: (출력) Mat 배열의 주소mv: (출력) 행렬의 벡터. vector<Mat>
// 정의
void merge(const Mat* mv, size_t count, OutputArray dst);
void merge(InputArrayOfArrays mv, OutputArray dst);
// 예제 코드
Mat src = imread("lenna.bmp");
vector<Mat> planes;
split(src, planes);
swap(planes[0], planes[2]); // Blue와 Red를 서로 바꿔주기
Mat dst;
merge(planes, dst);
mv: (입력) 1채널 Mat 배열 또는 행렬의 벡터count: (mv가 Mat 타입의 배열인 경우) Mat 배열의 크기dst: (출력) 다채널 행렬swap한 뒤에 BGR을 결합하였다.
📙강의 - 강사 황선규