더북(TheBook)

OpenCV 4.0에서는 C++11의 초기화 리스트(initializer list)를 이용한 행렬 초기화 방법을 사용할 수 있습니다. Mat 클래스 또는 Mat_ 클래스의 생성자에 행렬 크기와 초깃값을 중괄호를 이용한 리스트 형태로 전달하는 방식입니다. 다만 생성된 Mat 객체의 타입을 명시적으로 지정하기 위해 Mat_ 클래스 형식으로 생성한 후 Mat 타입으로 변경하는 것이 좋습니다. 다음은 앞서 설명한 mat5 행렬과 같은 초깃값을 갖는 행렬 mat6을 초기화 리스트 방법으로 생성하는 예제 코드입니다.

Mat mat6 = Mat_<float>({2, 3}, { 1, 2, 3, 4, 5, 6 });

비어 있는 Mat 객체 또는 이미 생성된 Mat 객체에 새로운 행렬을 할당하려면 Mat 클래스의 Mat:: create() 멤버 함수를 사용할 수 있습니다. Mat::create() 멤버 함수의 원형은 다음과 같습니다.

void Mat::create(int rows, int cols, int type);
void Mat::create(Size size, int type);

rows

새로 만들 행렬의 행 개수(영상의 세로 크기)

cols

새로 만들 행렬의 열 개수(영상의 가로 크기)

size

새로 만들 행렬의 크기

type

새로 만들 행렬의 타입

 

이미 행렬 데이터가 할당되어 있는 Mat 객체에서 Mat::create() 함수를 호출할 경우, 만약 Mat::create() 함수의 인자로 지정한 행렬 크기와 타입이 기존 행렬과 모두 같으면 Mat::create() 함수는 별다른 동작을 하지 않고 그대로 함수를 종료합니다. 반면에 새로 만들 행렬의 크기 또는 타입이 기존 행렬과 다른 경우, Mat::create() 함수는 일단 기존 메모리 공간을 해제한 후 새로운 행렬 데이터 저장을 위한 메모리 공간을 할당합니다. 예를 들어 이미 생성되어 있는 Mat 클래스 타입의 변수 mat4mat5에 새로운 크기와 타입의 행렬을 할당하려면 다음과 같이 코드를 작성합니다.

mat4.create(256, 256, CV_8UC3);    // 256x256, uchar, 3-channels
mat5.create(4, 4, CV_32FC1);       // 4x4, float, 1-channel 
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.