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) 계산
결과 화면:
'AI > Vision' 카테고리의 다른 글
Visual Studio에서 OpenCV 개발환경 설정하기 (0) | 2020.10.02 |
---|