Mat 클래스란 무엇인가요?
OpenCV에서 Mat은 이미지 데이터를 저장하는 핵심 클래스예요.
말 그대로 ‘매트릭스(Matrix)’의 줄임말로,
사진이나 영상은 결국 수많은 픽셀 값들이 모여 있는 2차원 배열이기 때문에 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 |