Mat 클래스WPF에서 Mat 클래스는 OpenCvSharp 라이브러리에서 이미지 데이터를 저장하고 처리하는데 사용되는 핵심 클래스이다. C#에서 OpenCV를 사용하려면 OpenCVSharp 라이브러리를 이용해야 하는데, 이 라이브러리에서 이미지를 다룰 때 Mat 클래스를 사용한다.
Mat 클래스는 행렬(Matrix) 을 의미하며, 이미지를 픽셀 값의 행렬로 표현한다. 즉, 이미지의 가로, 세로, 색상 정보(RGB) 등을 숫자 형태로 저장하고, 이를 이용하여 다양한 이미지 처리 작업을 수행할 수 있다. 마치 엑셀 스프레드시트처럼 행과 열로 이루어진 격자 형태로 이미지 데이터를 저장하는 것과 비슷하다고 생각하면 된다.
쉽게 말하면, Mat은 이미지 데이터를 담는 그릇과 같은 역할을 한다. 이 그릇에는 픽셀의 색상 정보, 밝기, 크기 등 다양한 정보가 담겨 있다.
Mat 클래스는 OpenCV에서 이미지를 처리하고 분석하는 데 필요한 다양한 메서드를 제공한다. 예를 들어, 이미지를 흑백으로 변환하거나, 블러 효과를 주거나, 특정 색상을 검출하는 등의 작업을 Mat 클래스의 메서드를 사용하여 수행할 수 있다.
Mat 클래스는 OpenCVSharp에서 제공하는 클래스로, WPF에서 OpenCV의 기능을 사용하기 위해서는 Mat 클래스를 사용해야 한다. 즉, Mat 클래스는 OpenCVSharp을 사용하여 WPF에서 컴퓨터 비전 작업을 수행하는 데 필수적인 클래스이다. using OpenCvSharp;
// 이미지 파일 로드
Mat image = new Mat("image.jpg", ImreadModes.Color);
// 이미지 크기 조절
Mat resizedImage = new Mat();
Cv2.Resize(image, resizedImage, new OpenCvSharp.Size(200, 100));
// 이미지 흑백 변환
Mat grayImage = new Mat();
Cv2.CvtColor(image, grayImage, ColorConversionCodes.BGR2GRAY);
// 이미지 출력
Cv2.ImShow("Original Image", image);
Cv2.ImShow("Resized Image", resizedImage);
Cv2.ImShow("Gray Image", grayImage);
Cv2.WaitKey(0);
// 메모리 해제
image.Dispose();
resizedImage.Dispose();
grayImage.Dispose();
Mat 클래스 사용 방법Mat 객체 생성: new Mat() 생성자를 사용하여 Mat 객체를 생성한다. 이미지 파일을 로드하거나, 비디오 캡처 장치에서 프레임을 가져오는 등 다양한 방법으로 Mat 객체를 생성할 수 있다.Cv2 클래스의 다양한 메서드를 사용하여 이미지 처리 작업을 수행한다. 예를 들어, Cv2.Resize() 메서드는 이미지 크기를 조절하고, Cv2.CvtColor() 메서드는 이미지 색상 공간을 변환한다.Mat 객체 해제: Dispose() 메서드를 사용하여 Mat 객체가 사용하는 리소스를 해제한다.주의 사항
Mat 객체는 이미지 데이터를 저장하기 위해 메모리를 할당한다. 따라서 Mat 객체를 사용한 후에는 Dispose() 메서드를 호출하여 메모리를 해제해야 한다.Mat 객체는 참조 형식이므로, Mat 객체를 다른 변수에 할당할 때는 얕은 복사가 수행된다. 즉, 두 변수가 같은 메모리 영역을 참조하게 된다. 따라서 이미지 데이터를 복사하려면 Clone() 메서드를 사용해야 한다.Mat 클래스는 기본적으로 이미지(행렬)을 표시하기 위한 데이터 형식이다.
Mat은 Matrix(행렬)의 약자로, 이미지를 픽셀 값의 행렬로 표현한다. 즉, 이미지를 숫자들의 격자 형태로 다루는 것이다. 각 픽셀은 숫자로 표현되며, 흑백 이미지는 밝기 값(0~255), 컬러 이미지는 RGB 색상 값(각 0~255)으로 이루어진 행렬로 표현된다.
(지난 게시물에서 Computer Vision에 대해 설명한 것 참고)
행렬의 크기
rows: 이미지의 행 개수 (높이)를 나타낸다.cols: 이미지의 열 개수 (너비)를 나타낸다.데이터 타입/깊이(채널)
type: 이미지 픽셀의 데이터 타입과 채널 수를 나타낸다. 색상 이미지라면 3채널을 가지며, 흑백 이미지라면 1채널을 갖는다. 예를 들어, CV_8UC3는 8비트 unsigned char 타입의, 3채널(BGR) 이미지를 의미한다.번외
Data: 이미지 픽셀 데이터를 저장하는 배열에 대한 포인터이다.Data 프로퍼티는 이미지 픽셀 데이터에 직접 접근해야 할 때 사용한다. 예를 들어, 픽셀 값을 변경하거나, 특정 영역의 픽셀 데이터를 추출하거나, 이미지 데이터를 다른 형식으로 변환하는 등의 작업을 수행할 때 Data 프로퍼티를 사용할 수 있다.Mat 클래스가 제공하는 다양한 메서드를 사용하여 이미지 처리 작업을 수행하는 것이 일반적이다. Cv2 클래스는 이미지 처리, 객체 인식, 영상 분석 등 다양한 작업을 위한 메서드를 제공한다. 이러한 메서드를 사용하면 Data 프로퍼티를 직접 사용하지 않고도 이미지를 효율적으로 처리할 수 있다.Data 프로퍼티는 이미지 픽셀 데이터에 직접 접근해야 하는 특별한 경우에만 사용하고, 일반적인 이미지 처리 작업은 Cv2 클래스의 메서드를 사용하는 것이 좋다.Mat 클래스는 크게 헤더(Header)와 데이터 포인터(Data Pointer) 두 부분으로 구성된다.
예를 들어, 컬러 이미지를 Mat 객체로 표현하면, 헤더에는 이미지의 가로, 세로 크기, 픽셀 데이터 타입(8비트 unsigned char), 색상 채널 수(3개, BGR) 등의 정보가 저장된다. 데이터 포인터는 각 픽셀의 BGR 값이 저장된 메모리 위치를 가리킨다.
좀 더 쉽게 설명하면, Mat 객체는 이미지를 담는 액자와 같다. 액자의 테두리에는 이미지의 제목, 작가, 크기 등의 정보가 적혀 있고 (헤더), 액자 안에는 실제 그림이 들어 있다 (데이터 포인터가 가리키는 이미지 데이터).
네임스페이스 추가
using OpenCvSharp;
OpenCV4의 데이터 형식이나 함수 및 메서드를 사용하기 위해 네임스페이스에 using OpenCvSharp;을 추가한다.
Mat 클래스 또한 using OpenCvSharp;에 포함되어 있다.
Tip : 모호한 참조가 발생했을 때, OpenCvSharp.*의 형태로 함수나 메서드를 호출해 사용한다.
Tip : 추가적인 기능이 포함된 확장 네임스페이스를 사용하기 위해서는 using OpenCvSharp.*;의 형태로 등록한다.
Mat 클래스 생성
Mat src = new Mat();
Mat src1 = new Mat(new Size(640, 480), MatType.CV_8UC3);
Mat src2 = new Mat(480, 640, MatType.CV_8UC3);
Mat 클래스의 일반적인 생성 형태는 위와 같다.
행렬의 크기는 Size 구조체를 사용하거나 행과 열에 값을 직접 입력하는 식으로 할당이 가능하다.
데이터 타입과 깊이(채널)은 MatType.*을 사용해 할당이 가능하다.
MatType은 CV_AABB의 구조를 가진다. AA는 데이터 타입을 의미하며, BB는 깊이(채널)을 의미한다.
즉, 8U는 unsigned 8-bit integers를 의미하며, C3는 3채널을 의미한다.
Mat 클래스 예시
using OpenCvSharp;
// 빈 Mat 객체 생성
Mat img1 = new Mat();
// 2행 3열, 8비트 unsigned char 타입의 1채널(Gray) 이미지 생성
Mat img2 = new Mat(2, 3, MatType.CV_8UC1);
// 2행 3열, 8비트 unsigned char 타입의 3채널(BGR) 이미지 생성, 모든 픽셀 값을 (100, 150, 200)으로 초기화
Mat img3 = new Mat(2, 3, MatType.CV_8UC3, new Scalar(100, 150, 200));
// 이미지 파일 로드
Mat img4 = Cv2.ImRead("image.jpg");
Mat 클래스 생성자
Mat(): 빈 Mat 객체를 생성한다.Mat(int rows, int cols, int type): 지정된 크기와 타입의 Mat 객체를 생성한다.Mat(Size size, int type): Size 객체를 사용하여 크기를 지정하고, 지정된 타입의 Mat 객체를 생성한다.Mat(int rows, int cols, int type, const Scalar& s): 지정된 크기와 타입의 Mat 객체를 생성하고, 모든 픽셀 값을 Scalar 값으로 초기화한다.즉, Mat 클래스 객체는 Size 구조체, Range 구조체, Rect 구조체, Scalar 구조체, 배열, 열거자, 포인터 등을 사용해 생성할 수 있다.
또한, 외부의 파일을 불러와 이미지를 Mat 클래스에 할당해 사용할 수도 있다.
Mat 클래스 사용 방법
Cv2.ImRead() 함수를 사용하여 이미지 파일을 로드하거나, VideoCapture 클래스를 사용하여 카메라에서 이미지를 캡처한다.Cv2.CvtColor(), Cv2.Resize(), Cv2.Blur() 등 OpenCV 함수를 사용하여 이미지를 처리한다.Cv2.ImShow() 함수를 사용하여 이미지를 화면에 표시한다.Cv2.ImWrite() 함수를 사용하여 이미지를 파일에 저장한다.Mat image = new Mat("image.jpg", ImreadModes.Color);
위 코드는 이미지 입력 함수를 활용해 이미지를 불러온다.
Cv2.ImRead("경로", flags)로 이미지를 불러와 변수에 할당한다.
경로는 상대 경로 또는 절대 경로를 사용해 이미지를 지정한다.
flags는 이미지를 불러올 때 적용할 초기 상태 값을 지정한다.
flags
ImreadModes.Unchanged : 원본 사용
ImreadModes.Grayscale : 1채널, 그레이스케일 적용
ImreadModes.Color : 3 채널, BGR 이미지 사용
ImreadModes.AnyDepth : 이미지에 따라 정밀도를 16/32비트 또는 8비트로 사용
ImreadModes.AnyColor : 가능한 3 채널, 색상 이미지로 사용
ImreadModes.LoadGdal : GDAL에서 지원하는 지리공간 데이터 이미지로 사용
ImreadModes.ReducedGrayscale2 : 1 채널, 1/2 크기, 그레이스케일 적용
ImreadModes.ReducedColor2 : 3 채널, 1/2 크기, BGR 이미지 사용
ImreadModes.ReducedGrayscale4 : 1 채널, 1/4 크기, 그레이스케일 적용
ImreadModes.ReducedColor4 : 3 채널, 1/4 크기, BGR 이미지 사용
ImreadModes.ReducedGrayscale8 :1 채널, 1/8 크기, 그레이스케일 적용
ImreadModes.ReducedColor8 : 3 채널, 1/8 크기, BGR 이미지 사용
ImreadModes.IgnoreOrientation : EXIF의 방향 플래그에 따라 이미지를 회전하지 않음
GDAL: 지리공간 데이터 추상화 라이브러리입니다.
EXIF: 이미지에 포함된 회전 정보등을 의미합니다.
WPF에서 OpenCVSharp 라이브러리 사용 이유
WPF는 .NET Framework에서 제공하는 UI 프레임워크이고, OpenCV는 C++로 작성된 컴퓨터 비전 라이브러리이다. 따라서 WPF에서 OpenCV를 직접 사용하기는 어렵다.
이때 OpenCVSharp 라이브러리가 WPF와 OpenCV를 연결하는 역할을 한다. OpenCVSharp은 OpenCV를 C#에서 사용할 수 있도록 해주는 래퍼 라이브러리이다.
Mat 클래스는 OpenCVSharp에서 제공하는 클래스로, WPF에서 OpenCV의 기능을 사용하기 위해서는 Mat 클래스를 사용해야 한다.
Mat 클래스의 주요 기능
C# OpenCV 강좌 : 제 2강 - Mat 클래스
https://076923.github.io/posts/C-opencv4-2/