AI/Vision

OpenCV 자료형 Mat Class 알아보기(1)

daeunnniii 2020. 10. 2. 22:53
728x90
반응형

Mat 클래스는 OpenCV의 가장 기본이 되는 클래스로, 행렬(Matrix) 구조체이다.

Mat class에는 다양한 생성자가 존재하고, 1, 2, 3차원 배열을 효율적으로 표현가능하다.

많이 사용하는 2차원은 아래와 같다.

 

Mat mtx(행 개수, 열 개수, 행렬 안 값들의 데이터 타입)

 

Mat 클래스는 헤더와 데이터 포인터로 이루어진다.

-헤더: Mat 클래스에 대한 정보. 행렬의 크기나 행렬의 깊이 등이 저장

-데이터 포인터: 각 데이터가 담겨있는 메모리 주소 정보가 저장

 

Mat 클래스의 구조는 크게 행렬의 크기, 데이터 타입, 깊이 3가지로 나눌 수 있다.

-행렬의 크기: 행과 열의 크기. int 타입으로 할당해 사용

-데이터 타입: 행렬의 각 요소에 대한 데이터 타입. int나 float 등으로 할당 가능

-깊이: 행렬의 깊이. 행렬이 몇개로 중첩되어있는지 의미한다. 색상 이미지면 3채널, 흑백 이미지면 1채널을 갖는다.

 

 

Mat 클래스 생성

 

Mat mtx(4,3, CV_32F) // 행 4개, 열 3개, 32bit float 타입으로 선언

Mat img(Size(3,4), CV_8UC3) // Size로 선언할 경우 Size(가로 개수, 세로 개수) 이므로 순서가 바뀜을 주의**

 

Mat* mtx3 = new Mat(3,3,CV_32F) //포인터를 통해 동적으로 mat 생성

delete mtx3 //할당한 것 해제 시켜줌

 

mtx.setTo(10) //mtx에 있는 모든 값을 10으로 설정

cout << mtx << endl //mtx 출력

 

cmtx2.setTo(11) //cmtx에 있는 모든 값을 11로 설정 

cout << cmtx2 << endl //cmtx2 출력

 

Mat m = Mat::ones(3, 3, CV_64F)  //모든 값이 1인 3행 3열
m = m * 3  //m의 모든 값에 3을 곱함

 

double dm[3][3] = {{1,2,1},{0,1,1},{1,0,100}}  //2차원 배열 생성

Mat m2 = Mat(3, 3, CV_64F, dm)  //4번째 인자로 dm을 넣어 dm을 mat으로 만들어줌

 

사칙연산(+,-,*,/)를 해서 출력

 

여기서 m*m2는 행렬곱이 계산되고, 각각 같은 위치에 있는 숫자를 곱하고 싶으면

m.mul(m2)를 사용하면 된다.

 

*주의해야할 점

double dm[3][3] = {{1,2,1},{0,1,1},{1,0,100}}  //2차원 배열 생성
Mat m2 = Mat(3, 3, CV_64F, dm)

위와 같이 배열값을 참조해서 생성시킨 mat은 

mat의 값을 바꾸면 배열에 있는 값도 바뀌고, 배열에 있는 값을 바꾸어도 mat에 있는 값도 바뀐다.

 

//dm의 행렬 값을 1행1열, 1행 2열,.....마지막행, 마지막열까지 출력

for(int i=0; i < 3; ++i) {
  for (int j = 0;j < 3;++j) {
    cout << dm[i][j] << " ";
  cout << endl;
  }
}


dm[2][2] = 1000; //dm의 2행2열 값을 1000으로 바꾸고 m2를 출력해보면 m2도 2행2열 값이 1000으로 출력됨


double dm2[3][3] = { {1,2}, {0,1},{1,0} }; //역행렬 계산을 위해 행과 열의 개수 맞춰줌
Mat m3 = Mat(3, 3, CV_64F, dm2);  //dm2를 mat으로 만들어줌

 

cout << m3.inv() << endl; //m3 역행렬 계산

cout << m2.t() << endl; //m3 전치행렬(transpose) 계산

 

 

결과 화면:

 

 

728x90
반응형

'AI > Vision' 카테고리의 다른 글

Visual Studio에서 OpenCV 개발환경 설정하기  (0) 2020.10.02