컴퓨터비전

OpenCV 함수

mihee 2022. 3. 20. 00:50

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

행렬의 합 구하기

Scalar sum(InputArray src);

uchar data[] = {1,2,3,4,5,6};
Mat mat1(2,3,CV_8C1, data);

int sum1 = (int)sum(mat1)[0] //21
  • src : 입력 행렬, 1~4 채널.
  • 반환값 : 행렬 원소들의 합

행렬의 평균 궂하기

Scalar mean(InputArray src, InputArray mask = noArray()); // 0이 아닌부분에서 mean 계산

//example
Mat img = imread("lenna.bmp", IMREAD_GRAYSCALE);

double mean1 = mean(img)[0]; // 124.0
  • mask : 마스크 영상

행렬의 최댓값/최솟값 구하기

void minMaxLoc(InputArray src, double* minVal, double* maxVal = 0, Point* minLoc = 0, Point* maxLoc = 0, InputArray mask = noArray());


//example
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;

//example
Mat img = imread("lenna.bmp", IMREAD_GRAYSCALE);

Mat fimg;
img.convertTo(fimg, CV_32FC1);
  • m : 출력 영상(행렬)
  • rtype : 원하는 출력 행렬 타입
  • alpha : 추가적으로 곱할 값
  • beta : 추가적으로 더할 값

행렬의 정규화(원소 값 범위 정규화)

void normalize(InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0, int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());
  • alpha : (노름 정규화인 경우) 목표 노름값, (NORM_MINMAX인 경우) 최솟값
  • beta : (NNORM_MINMAX 인 경우) 최댓값
  • norm_type : 정규화 타입.
  • dtype : 출력 행렬의 타입
  • mask : 마스크 영상

색 공간 변환 함수

void cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0);
  • code : 색 변환 코드
    • COLOR_BGR2GRAY
    • COLOR_BGR2HSV
    • COLOR_BGR2YCrCb
  • dstCn : 결과 영상의 출력 수. 0이면 자동 결정됨.

채널 분리와 병합

채널 분리

void split(const Mat& src, Mat* mvbdgin);
void split(InputArray src, OutputArrayOfArrays mv);

// example
Mat src = imread("lenna.bmp"); //B,G,R

vector<Mat> planes;
split(src, planes);
  • src : (입력) 다채널 행렬
  • mvbdgin : (출력)Mat 배열의 주소
  • mv : (출력) 행렬의 벡터. vector

채널 결합

void merge(const Mat* mv, size_t count, OutputArray dst);
void merge(InputArrayofArrays mv, OutputArray mv);

// example
Mat src = imread("lenna.bmp"); //B,G,R

vector<Mat> planes;
split(src, planes);

swap(planes[0], planes[2]); // B와 R을 swap

Mat dst;
merge(planes, dst); // 3개 plane을 합쳐줌.
  • src : (입력) 1채널 Mat 배열 또는 형렬의 벡터
  • count : (mv가 Mat 타입의 배열인 경우) Mat 배열의 크기
  • dst : (출력) 다채널 행렬

연산 시간 측정 방법

  • 연산 시간 측정

    • 대부분의 영상 처리 시스템은 대용량 영상 데이터를 다루고 복잡한 알고리즘 연산을 수행
    • 영상 처리 시스템 각 단계에서 소요되는 연산 시간을 측정하고 시간이 오래 걸리는 부분을 찾아 개선하는 시스템 최적화 작업이 필수적
  • 연산 시간 측정 방법 (release 모드에서 수행)

int64 t1 = getTickCount();

my_func();

int64 t2 = getTickCount();
double ms = (t2 - t1) * 1000 / getTickFrequency();
  • TickMeter 클래스
    • 연산 시간 측정을 위한 직관적인 인터페이스 제공
TickMeter tm;
tm.start();

func1();

tm.stop();
cout << "func1() : " << tm.getTimeMilli() << "ms"<< endl;

tm.reset();

마스크 연산과 ROI

  • 관심 영역(ROI ; Region of interest)
    • 영상에서 특정 연산을 수행하고자 하는 임의의 부분 영역
  • 마스크 연산
    • OpenCV는 일부 함수에 대해 ROI 연산을 지원하며, 이때 마스크 영상(mask image)을 인자로 함께 전달해야 함
      • ex) copyTo(), calcHist(), bitwise_or(), matchTemplate(), etc.
    • 마스크 영상은 CV_8UC1 타입(그레이스케일 영상)
    • 마스크 영상의 픽셀 값이 0이 아닌 위치ㅔㅇ서만 연산이 수행됨
      • 보통 마스크 영상으로는 0 또는 255로 구성된 이진 영상을 사용

마스크 연산을 지원하는 픽셀 값 복사 함수

void Mat::copyTo(InputArray m, InputArray mask)const;
  • m : 출력 영상. * this와 크기 및 타입이 같은 m를 입력으로 지정하면 m를 새로 생성하지 않고 연산을 수행. 그렇지않으면 m를 새로 생성하여 연산을 수행한 후 반환함.
  • mask : 마스크 영상. CV_8U. 0이 아닌 픽셀에 대해서만 복사 연산을 수행

마스크 연산을 지원하는 픽셀 값 복사 함수(전역함수)

void copyTo(InputArray src, OutputArray dst, InputArray mask);
  • src : 입력영상
  • dst : 출력영상(비어 있는 영상이 아니라 똑같은 크기, 타입 영상이면 그 위에 연산 수행)