2019/11/1_Computer Vision_3_ OpenCV Mat 클래스
2. OpenCV Mat 클래스
2.1 Mat 클래스
OpenCV에서 가장 많이 사용하는 클래스는 행렬을 나타내는 Mat클래스이다.
이번에는 Mat클래스를 이용하여 행렬 또는 영상을 생성하는 기본방법부터 복사, 부분 추출, 정보 참조 등을 알아본다.
ㄱ) Mat 클래스 개요
cf) Mat 클래스는 행렬(matrix)을 표현하는 클래스이지만, OpenCV가 컴퓨터 비전 라이브러리이기 때문에 실제로는 2차원 영상을 표현하는 용도로 많이 사용된다.
Mat클래스는 2차원 행렬뿐만 아니라 고차원 행렬을 표현할 수 있으며, 한 개이상의 채널을 가질 수 있다.
Mat클래스에는 정수, 실수, 복소수 등으로 구성된 행렬 또는 벡터, 그레이스케일 또는 컬러 영상을 저장할 수 있다.
cf) OpenCV에서 사용하는 주요 자료형
ㆍschar == 부호 있는 1바이트 정수
ㆍuchar == 부호 없는 1바이트 정수
ㆍshort == 부호 있는 2바이트 정수
ㆍushort == 부호 없는 2바이트 정수
ㆍint == 부호 있는 4바이트 정수
ㆍuint == 부호 없는 4바이트 정수
ㆍint64 == 부호 있는 8바이트 정수
ㆍuint64 == 부호 없는 8바이트 정수
ㆍfloat16_t == 부호 있는 2바이트 실수
ㆍfloat == 부호 있는 4바이트 실수
ㆍdouble == 부호 있는 8바이트 실수
***
2.2 행렬의 생성과 초기화
행렬의 생성
Mat(int rows, int cols, int type);
ㆍrows == 생성할 행렬의 행 개수(영상의 height 크기) ㆍcols == 생성할 행렬의 열 개수(영상의 width 크기) ㆍtype == 생성할 행렬의 타입
Mat(Size size, int type);
ㆍsize == 생성할 행렬의 크기 ( Size(cols, rows) 또는 Size(width, height) )
ㆍtype == 생성할 행렬의 타입
위의 방식처럼 행렬의 크기와 타입을 지정하여 Mat 객체를 생성할 경우, 모든 원소는 쓰레기값으로 채워진다.
생성과 동시에 특정 값으로 초기화 하려면 아래의 방법이 안전하다.
행렬의 생성과 초기화
Mat(int rows, int cols, int type, const Scalar& s);
ㆍrows == 생성할 행렬의 행 개수(영상의 height 크기) ㆍcols == 생성할 행렬의 열 개수(영상의 width 크기) ㆍtype == 생성할 행렬의 타입 ㆍs == 행렬 원소 초깃값
Mat(Size size, int type, const Scalar& s);
ㆍsize == 생성할 행렬의 크기 ( Size(cols, rows) 또는 Size(width, height) )
ㆍtype == 생성할 행렬의 타입 ㆍs == 행렬 원소 초깃값
자주 사용되는 형식인 모든 원소가 0인 행렬 등은 별도의 함수로 제공한다.
Mat zeros(int rows, int cols, int type);
Mat zeros(Size size, int type);
모든 원소가 0인 행렬 생성
위의 설명과 동일.
Mat ones(int rows, int cols, int type);
Mat ones(Size size, int type);
모든 원소가 1인 행렬 생성
위의 설명과 동일.
Mat eyes(int rows, int cols, int type);
Mat eyes(Size size, int type);
단위 행렬 생성
위의 설명과 동일.
사용 예시
Mat img_1C(480, 640, CV_8UC1);
// unsigned char 자료형, 채널 1개, 그레이스케일 영상에서 사용
Mat img_3C(480, 640, CV_8UC1);
// unsigned char 자료형, 채널 3개, 컬러영상에 사용
Mat img(Size(640, 480), CV_8UC3);
// img_3C와 동일한 영상을 다른 방식으로 생성
Mat img_init(480, 640, CV_8UC1, Scalar(127));
// 모든 픽셀이 127로 초기화된 영상 생성
Mat mat_0 = zeros(3, 3, CV_32SC1);
// 모든 원소가 0인 3X3 정수형 행렬
Mat mat_0 = ones(3, 3, CV_32FC1);
// 모든 원소가 1인 3X3 실수형 행렬
Mat mat_0 = eye(3, 3, CV_32FC1);
// 3X3 단위 행렬행렬의 복사
Mat img = imread(“dog.jpg”);
Mat copy_img = img;
이렇게 대입연산자로 할당하면 얕은 복사가 수행되어 하나의 영상을 공유하는 서로 다른 이름의 변수 형태로 동작한다.
새로운 메모리공간을 할당하여 완전히 2개의 동일한 영상을 만들려면 clone()과 copyTo()함수를 써야한다.
Mat::clone();
ㆍ반환값 : *this 행렬의 복사본
Mat::copyTo(OutputArray m); Mat::copyTo(OutPutArray m, InputArray mask);
ㆍm : 복사본이 저장될 행렬
ㆍmask : 마스크 행렬, 마스크 행렬의 원소 값이 0이 아닌 좌표에서만 행렬 원소를 복사한다.