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 클래스 타입의 변수 mat4와 mat5에 새로운 크기와 타입의 행렬을 할당하려면 다음과 같이 코드를 작성합니다.
mat4.create(256, 256, CV_8UC3); // 256x256, uchar, 3-channels mat5.create(4, 4, CV_32FC1); // 4x4, float, 1-channel