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_t
Mat::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을 결합하였다.📙강의 - 강사 황선규