컴퓨터비전
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로 구성된 이진 영상을 사용
- OpenCV는 일부 함수에 대해 ROI 연산을 지원하며, 이때 마스크 영상(mask image)을 인자로 함께 전달해야 함
마스크 연산을 지원하는 픽셀 값 복사 함수
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 : 출력영상(비어 있는 영상이 아니라 똑같은 크기, 타입 영상이면 그 위에 연산 수행)