본문 바로가기
Computer Vision

OpenCV 주요 클래스 - 2. Mat 클래스(2)

by ksb0511 2020. 2. 9.

2. 행렬의 생성과 초기화

// 1. Mat 객체 생성
Mat::Mat(int rows, int cols, int type);		// 세로, 가로 순서로 입력
Mat::Mat(Size size, int type);				// Size 클래스 내부에 값 지정 시 가로, 세로 순서로 입력

// 2. Mat 객체 생성 - 쓰레기 값 생성 방지
Mat::Mat(int rows, int cols, int type, const Scalar& s);
Mat::Mat(Size size, int type, const Scalar& s);

 

  • type에는 Mat 객체의 타입을 나타내는 매크로 상수를 전달. <- "Mat클래스(1)" 내용 속 ex) CV_8UC1
  • Size 클래스의 생성자는 보통 두 개의 인자를 받음. (가로, 세로 순서로 입력)
  • 1처럼 Mat 객체에 행렬의 크기와 타입을 지정하여 생성할 경우, Mat 행렬의 모든 원소는 흔히 쓰레기 값이라고 부르는 임의의 값으로 채워짐.
  • 2처럼 객체를 생성할 경우 모든 원소 값을 초기화 시킬 수 있음.
  • s : 행렬 원소 초깃값을 설정하는 인자
  • Scalar 클래스는 4개의 실수 값을 저장할 수 있는 OpenCV 클래스
    • 주로 영상의 픽셀 값을 표현하는 용도로 사용
    • Scalar 클래스가 그레이스케일 영상의 픽셀 값을 표현할 경우 1개의 멤버 변수만 사용
    • 3채널 컬러 영상의 픽셀 값을 표현할 시에는 3개의 멤버 변수를 사용

// 모든 원소가 0으로 초기화된 행렬 생성
static MatExpr Mat::zeros(int rows, int cols, int type);
static MatExpr Mat::zeros(Size size, int type);

// 행렬의 모든 원소가 1로 초기화된 행렬 생성
static MatExpr Mat::ones(int rows, int cols, int type);
static MatExpr Mat::ones(Size size, int type);

// 단위행렬 생성
static MatExpr Mat::eyes(int rows, int cols, int type);
static MatExpr Mat::eyes(Size size, int type);

 

  • 반환값은 초기화된 행렬 표현식
  • Mat 클래스의 정적 멤버 함수이므로 실제 코드에서 사용할 시 "Mat::"을 붙여 사용

// 외부 메모리 공간을 활용하여 Mat 객체 생성
Mat::Mat(int rows, int cols, int type, void * data, size_t step=AUTO_STEP);
Mat::Mat(Size size, int type, void * data, size_t step=AUTO_STEP);

 

  • 외부 메모리 공간을 활용하여 객체 생성하면 자체적인 메모리 할당을 수행하지 않고 외부 메모리를 참조하는 방식이기 때문에 객체 생성이 빠름.
  • ex) 
float data[] = {1, 2, 3, 4, 5, 6};
Mat mat4(2, 3, CV_32FC1, data);
  1. 외부 배열 크기와 생성할 행렬 원소 개수는 같아야 함.
  2. 서로 사용하는 자료형이 같아야 함.
  3. 결론적으로 mat4 행렬은 다음과 같은 형태

mat4 형태

  • 외부 메모리 공간을 참조하여 Mat 객체를 생성할 경우, Mat 객체의 원소 값과 외부 메모리 공간의 데이터 값은 상호 공유됨. 즉, mat4 객체 생성 후 외부 메모리 공간의 값 변경 시 mat4 행렬의 원소도 같이 변경. 반대로 mat4 행렬의 원소를 변경해도 외부 메모리 공간의 값 변경됨.
  • 동적 할당하여 만든 대용량 메모리도 Mat 클래스에 참조하여 사용가능. But, 동적 할당한 메모리는 Mat 객체가 소멸될 때 자동으로 해제하지 않을 경우 반드시 사용자가 직접 메모리를 해제해야 함.
  • ex) Mat 객체를 생성하는 방법 - (Mat_ 클래스를 사용하는 방법)
Mat_<float> mat5_(2, 3);
mat5_ << 1, 2, 3, 4, 5, 6;
Mat mat5 = mat5_;

 

  1. mat5_는 float 자료형을 사용하는 2x3 행렬, Mat_ 클래스는 템플릿 클래스로 정의되어 있어서 저장할 원소의 자료형을 명시적으로 지정해주어야 함.
  2. Mat_ 클래스는 << 연산자와 콤마(,)를 이용하여 간단하게 행렬 원소 값을 설정하는 인터페이스를 제공
  3. mat5_의 행렬을 복사하여 Mat 클래스 타입의 변수 mat5 선언.

// 비어 있는 Mat 객체 or 이미 생성된 Mat 객체에 새로운 행렬 할당
void Mat::create ( int rows, int cols, int type );
void Mat::create ( Size size, int type );

 

  • create() 함수의 인자로 지정한 행렬 크기, 타입이 기존과 모두 같을 경우 별다른 동작 x, 그러나 다를 경우 기존 메모리 공간 해제 후 새로운 행렬 데이터 저장을 위한 메모리 공간을 할당
  • 이 함수에는 새로 만든 행렬의 원소 값을 초기화하는 기능이 없음.

// Mat 행렬의 전체 원소 값 설정
Mat& Mat::operator = ( const Scalar& s );
Mat& Mat::setTo ( InputArray value, InputArray mask = noArray() );

 

  • Mat 클래스는 = 연산자 재정의 또는 Mat::setTo() 멤버 함수를 이용하여 행렬 전체 원소 값을 한꺼번에 설정
  • =연산자 재정의
    • s 값은 행렬 원소에 설정할 값
    • 반환값 : 값이 설정된 Mat 객체의 참조
  • Mat::setTo() 멤버 함수
    • value : 행렬 원소에 설정할 값
    • mask : 마스크 행렬. 마스크 행렬의 원소가 0이 안인 위치에서만 value 값이 설정. 행렬 전체 원소 값 설정하려면 noArray() 또는 Mat()을 지정
    • 반환값 : Mat 객체의 참조

댓글