유용한 OpenCV 함수(1)

전종원·2022년 10월 17일
0

1. 행렬 합, 평균, 최댓값/최솟값 구하기

Scalar sum(InputArray src);
  • src: 입력행렬 1~4 채널
  • 반환값: 해렬 원소들의 합
uchar data[] = {1, 2, 3, 4, 5, 6};
Mat mat1(2, 3, CV_8UC1, data);

//mat1(2행 3열)
// [1, 2, 3]
// [4, 5, 6]

int sum1 = (int)sum(mat1)[0]; //21

평균

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] //124.0

// [0]의 의미
// 반환값 Scalar는 4개의 원소를 가짐. 그중 0번째 원소를 가져오겠다는 뜻
// mean(img) = [124.000, 0.000, 0.000, 0.000]

행렬의 최댓값/최솟값

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); // 25, 245, [508, 71], [116, 273]

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);

0개의 댓글