1. 행렬 합, 평균, 최댓값/최솟값 구하기
합
Scalar sum(InputArray src);
- src: 입력행렬 1~4 채널
- 반환값: 해렬 원소들의 합
uchar data[] = {1, 2, 3, 4, 5, 6};
Mat mat1(2, 3, CV_8UC1, data);
int sum1 = (int)sum(mat1)[0];
평균
Scalar mean(InputArray src, InputArray mask = noArray());
- src: 입력행렬 1~4채널
- mask: 마스크영상
- 만약 마스크행렬이 src와 크기가 같고 0과 0이 아닌 수들로 이루어져있다면 src 전체에서 0이 아닌 부분들만의 평균을 계산함.
- 반환값: 행렬의 평균값
Mat img = imread("lenna.bmp", IMREAD_GRAYSCALE);
double mean1 = mean(img)[0]
행렬의 최댓값/최솟값
void minmaxLoc(InputArray src, double* minVal, double* maxVal = 0, Point* minLoc = 0,
Point* maxLoc = 0, InputArray mask = noArray());
- src: 입력영상. 단일채널.
- minVal, maxVal: 최솟값, 최댓값 변수 포인터(필요없으면 NULL로 지정)
- minLoc, maxLoc: 최솟값, 최댓값 위치변수 포인터(필요없으면 NULL로 지정)
- mask: 마스크영상. mask 행렬 값이 0이 아닌 부분에서만 연산을 수행.
Mat img = imread("lenna.bmp", IMREAD_GRAYSCALE);
double minv, maxv;
Point minLoc, maxLoc;
minMaxLoc(img, &minv, &maxv, &minLoc, &maxLoc);
2. 영상 속성 변환하기
행렬의 자료형 변환
void Mat::convertTo(OutputArray m, int rtype, double alpha=1, double beta=0) const;
- m: 출력영상
- rtype: 원하는 출력행렬타입
- alpha: 추가적으로 곱할 값
- beta: 추가적으로 더할 값
Mat img = imread("lenna.bmp", IMREAD_GRAYSCALE);
Mat fimg;
img.convertTo(fimg, CV_32FC1);
행렬의 정규화
void normalize(InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0,
int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());
- src: 입력영상
- dst: 출력영상
- alpha: norm 정규화인경우 목표 norm값, norm_minmax인 경우 최솟값
- beta: NORM_MINMAX인경우 최댓값
- norm_type: 정규화 타입.
- NORM_INF
- NORM_L1
- NORM_L2
- NORM_MINMAX
- dtype: 출력행렬의 타입
- mask: 마스크 영상
Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);
Mat dst;
normalize(src, dst, 0, 255, NORM_MINMAX);
색공간 변환 함수
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0);
- src: 입력영상
- dst: 출력영상
- code: 색 변환 코드
- dstCn: 결과영상의 채널 수. 0이면 자동 결정됨.
Mat src = imread("lenna.bmp");
Mat dst;
cvtColor(src, dst, COLOR_BGR2GRAY);
3. 채널 분리와 병합
채널분리
void split(const Mat& src, Mat* mvbegin);
void split(InputArray src, OutputArrayOfArrays mv);
- src: 입력(다채널) 행렬
- mvbegin: 출력 Mat 배열의 주소
- mv: 출력 행렬의 벡터
Mat src = imread("lenna.bmp");
vector<Mat> planes;
split(src, planes);
채널병합
void merge(const Mat* mv, size_t count, OutputArray dst);
void merge(InputArrayOfArrays mv, OutputArray dst);
- mv: 입력 단일채널 Mat배열 혹은 행렬의 벡터
- count: (mv가 Mat 타입의 배열인 경우) Mat 배열의 크기
- dst: 출력 다채널 행렬
Mat src = imread("lenna.bmp");
vector<Mat> planes;
split(src, planes);
swap(planes[0], planes[2]);
Mat dst;
merge(planes, dst);