본문 바로가기

난 이 분야 전문가야!/OpenCV

OpenCV :: Mat Class 사용법 정리 (생성 및 기본연산, C++)

< Mat Class 행렬 생성법 >

// 1
Mat m1(3, 3, CV_32F);   // 32bit float형 3x3 행렬

// 2
Mat m2;
m2 = Mat(5, 3, CV_64FC2);   // 64bit float형 5x3 행렬 channel 수는 2

// 3 동적할당으로 생성
Mat* m3 = new Mat(Size(640, 480), CV_8UC3);    // 480x640 해상도의 컬러이미지(3 channel)
delete m3;

1 ) m1 행렬의 경우 32bit float형의 3행 3열 행렬이 생성된다.

2 ) m2 행렬의 경우 64bit float형의 5행 3열 채널 수는 2인 행렬이 생성된다. (총 원소의 개수는 5 x 3 x 2로 30개)

3 ) m3 행렬의 경우 동적할당으로 생성했으며 Size() 함수를 사용하여 행렬을 생성했다. (사용 완료 후 delete 메모리 해제)

      480행 640열 채널 수는 3인 행렬이 생성된다.

 

Size() 함수의 경우 width(cols), height(rows) 순서로 인자를 넣기 때문에 일반 Mat 클래스 선언과는 행, 열 기입 순서가 반대가 되는 것에 주의하자.

 

>>> 실행 결과

더보기
3x3
5x3 channel 2

 

float data1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
float data2[][3] = { {1, 0, 0}, {0, 1, 0}, {0, 0, 1} };

Mat m6(3, 3, CV_32F, data1);
Mat m7(3, 3, CV_32F, data2);

이렇게 배열을 사용하여 원하는 값으로 초기화 가능 (행 우선으로 채워진다.) 

여기서 주의할 점은 배열을 참조하여 행렬을 생성하기 때문에 행렬이나 배열의 값이 변경되었을 때는 참조되는 대상의 값 또한 같이 변경된다.

 

>>> 실행 결과

 

< Mat Class 기본 연산 >

** 사칙연산 **

+, -, *, / 사칙연산을 기본적으로 제공해준다.

곱하기를 제외하곤 모두 element-wise 연산을 수행

곱하기의 경우 행렬곱 연산 수행

 

** 자주 사용하는 함수 **

m7.setTo(1)      // m7 Mat의 원소를 모두 1로 설정

m7.inv()            // m7 Mat의 역행렬 (inverse of matrix) 반환

m7.t()                // m7 Mat의 전치행렬 (transpose of matrix) 반환

 

728x90