만약 복사본 영상을 새로 생성할 때, 픽셀 데이터를 공유하는 것이 아니라 메모리 공간을 새로 할당하여 픽셀 데이터 전체를 복사하고 싶다면 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); // 깊은 복사