더북(TheBook)

외부 메모리 공간의 주소를 지정하는 Mat 클래스의 생성자를 이용하여 작은 크기의 행렬을 생성하는 예제 코드를 살펴보겠습니다. 다음 코드는 여섯 개의 원소를 갖는 float 자료형의 배열 data를 먼저 정의하고, 이 배열을 행렬 원소로 사용하는 Mat 객체 mat4를 생성합니다.

float data[] = { 1, 2, 3, 4, 5, 6 };
Mat mat4(2, 3, CV_32FC1, data);

이처럼 외부 배열을 행렬 원소 값으로 사용하고자 할 경우, 외부 배열 크기와 생성할 행렬 원소 개수는 같아야 하고 서로 사용하는 자료형도 같아야 합니다. 앞 코드에서 data 배열은 여섯 개의 원소를 가지고 있고, mat4 행렬도 2행 3열이므로 원소가 여섯 개입니다. 또한 datamat4는 모두 float 자료형을 사용합니다. 앞과 같이 코드를 작성할 경우 mat4 행렬의 1행은 data 배열의 처음 세 개의 원소로 채워지고, 2행은 data 배열의 나머지 세 원소로 채워집니다. 결국 앞 코드에 의해 생성되는 mat4 행렬은 다음과 같은 형태를 갖습니다.

이처럼 외부 메모리 공간을 참조하여 Mat 객체를 생성할 경우, Mat 객체의 원소 값과 외부 메모리 공간의 데이터 값이 상호 공유된다는 점을 기억해야 합니다. 즉, mat4 객체를 생성한 후 외부 메모리 공간의 값을 변경하면 mat4 행렬의 원소 값도 같이 변경됩니다. 반대로 mat4 행렬의 원소 값을 변경하면 외부 메모리 공간의 값도 변경됩니다. 이는 하나의 메모리 공간을 서로 공유하기 때문에 당연한 일이지만, 소스 코드를 작성할 때에는 주의를 기울여야 합니다. 동적 할당하여 만든 대용량 메모리도 Mat 클래스에서 참조하여 사용할 수 있습니다. 다만 동적 할당한 메모리는 Mat 객체가 소멸될 때 자동으로 해제되지 않으므로 반드시 사용자가 직접 메모리를 해제해야 합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.