본문 바로가기

IT

OpenCV Mat 클래스 구조와 메모리 이해

Mat 클래스란 무엇인가요?

OpenCV에서 Mat은 이미지 데이터를 저장하는 핵심 클래스예요.

말 그대로 ‘매트릭스(Matrix)’의 줄임말로,

사진이나 영상은 결국 수많은 픽셀 값들이 모여 있는 2차원 배열이기 때문에 Mat으로 표현할 수 있어요.

 

OpenCV Mat

 

단순히 사진뿐만 아니라, 그레이스케일 이미지, 마스크 이미지, 필터 결과까지도 다 Mat 객체에 저장된다고 보면 됩니다.

 

 

Mat의 구조: 데이터 + 정보

Mat 객체는 크게 두 가지로 나눠볼 수 있어요.
하나는 픽셀 데이터 자체, 다른 하나는 데이터에 대한 정보(header)예요.

이 header에는 이미지의 크기(rows, cols), 채널 수, 데이터 타입(CV_8UC3 등), 참조 횟수(refcount) 같은 정보가 들어 있어요.

중요한 점은, OpenCV는 메모리를 효율적으로 쓰기 위해 얕은 복사(shallow copy)를 기본으로 한다는 거예요.

그래서 Mat a = b; 처럼 하면 b의 데이터를 공유하기만 하지 실제 복사되진 않아요.

 

Mat 메모리 다루기: 복사와 공유의 차이

이미지를 복사한다고 해서 항상 새로운 메모리가 생기는 건 아니에요.

예를 들어 아래 코드처럼 하면 실제 이미지는 하나고, 두 객체가 같은 메모리를 가리켜요

cv::Mat img1 = cv::imread("sample.jpg");
cv::Mat img2 = img1;  // 얕은 복사, 메모리 공유됨

 

이런 상태에서 img2를 수정하면 img1도 바뀌어요!

만약 진짜 복사본이 필요하다면 clone()이나 copyTo()를 사용해야 해요.

 

cv::Mat img3 = img1.clone();  // 깊은 복사

 

Mat을 잘 쓰기 위한 팁

Mat은 매우 유연해서 행과 열 단위로 접근할 수도 있고, ROI(관심 영역) 지정도 쉽게 할 수 있어요.
또한 다양한 데이터 타입을 지원해서 CV_8UC1, CV_32FC3 등 원하는 형식으로 만들 수 있어요.

하지만 메모리를 많이 쓰는 연산을 할 때는 항상 얕은 복사 vs 깊은 복사를 구분해서 써야 해요.

성능이나 버그에 직접적인 영향을 줄 수 있거든요.

실전에서는 Mat이 단순한 이미지 그릇이 아니라, 메모리 효율성과 계산 최적화를 함께 고려한 고급 구조체라는 걸 명심하자구요.

 

 

얕은 복사 vs 깊은 복사: 직접 비교 예제

OpenCV의 Mat 객체는 기본적으로 얕은 복사를 하기 때문에, 하나의 이미지 데이터를 여러 Mat 객체가 공유할 수 있어요.

아래 코드를 보면 이 차이를 쉽게 확인할 수 있어요

 

cv::Mat img = cv::imread("sample.jpg");
cv::Mat shallow = img;             // 얕은 복사 (데이터 공유)
cv::Mat deep = img.clone();        // 깊은 복사 (데이터 복제)

// shallow 복사본을 흰색으로 덮어쓰기
shallow.setTo(cv::Scalar(255, 255, 255));

// 결과 보기
cv::imshow("Original img", img);       // img도 흰색으로 바뀜 (shallow이기 때문에)
cv::imshow("Deep Copy img", deep);     // clone된 deep은 원본 유지됨
cv::waitKey(0);

 

결과:

  • img와 shallow는 같은 메모리를 참조하고 있기 때문에, shallow.setTo()를 하면 img도 같이 바뀌어요.
  • 반면 deep은 clone()으로 완전히 복제된 별도의 메모리를 갖고 있어서, 영향을 받지 않고 원래 이미지를 그대로 유지해요.

 

이 예제 하나만으로도 얕은 복사의 위험성과 깊은 복사의 필요성을 분명히 알 수 있어요.

특히 이미지 전처리나 중간 결과 저장 시에는 clone()의 사용을 꼭 고려해야 합니다.

 

 

'IT' 카테고리의 다른 글

OpenCV에서 Color Space(BGR ↔ HSV 등) 변환하기  (0) 2025.06.24
OpenCV Scalar 클래스 활용법!  (0) 2025.06.24
OpenCV Rect 클래스 완전 정복  (0) 2025.06.24
OpenCV Size_ 클래스  (0) 2023.05.18
OpenCV 개발툴 - Visual Studio 2019  (0) 2023.05.17