더북(TheBook)

만약 복사본 영상을 새로 생성할 때, 픽셀 데이터를 공유하는 것이 아니라 메모리 공간을 새로 할당하여 픽셀 데이터 전체를 복사하고 싶다면 Mat::clone() 또는 Mat::copyTo() 함수를 사용해야 합니다. Mat::clone() 함수와 Mat::copyTo() 함수의 원형은 다음과 같습니다.

Mat Mat::clone() const;

반환값

*this 행렬의 복사본

 

void Mat::copyTo(OutputArray m) const;
void Mat::copyTo(OutputArray m, InputArray mask) const;

m

복사본이 저장될 행렬. 만약 *this 행렬과 크기 및 타입이 다르면 메모리를 새로 할당한 후 픽셀 값을 복사합니다.

mask

마스크 행렬. 마스크 행렬의 원소 값이 0이 아닌 좌표에서만 행렬 원소를 복사합니다.

 

Mat::clone() 함수는 자기 자신과 동일한 Mat 객체를 완전히 새로 만들어서 반환합니다. Mat:: copyTo() 함수는 인자로 전달된 m 행렬에 자기 자신을 복사합니다. 만약 Mat::copyTo() 함수를 호출한 행렬과 인자로 전달된 행렬 m이 서로 크기와 타입이 같으면 원소 값 복사만 수행합니다. 반면에 서로 크기 또는 타입이 다르면 Mat::copyTo() 함수 내부에서 행렬 m을 새로 생성한 후 픽셀 값을 복사합니다.

Mat::clone()Mat::copyTo() 함수를 사용하는 예제 코드를 살펴보겠습니다. 앞에서 dog.bmp 강아지 영상을 저장하고 있던 img1 영상을 Mat::clone()Mat::copyTo() 함수를 이용하여 새로운 영상에 복사하려면 다음과 같이 코드를 작성합니다.

Mat img4 = img1.clone();        // 깊은 복사
 
Mat img5;
img1.copyTo(img5);              // 깊은 복사
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.