imgDisplay.Source = frame.ToBitmapSource();
Mat filteredFrame = frame.Clone();
imgDisplay.Source =
WriteableBitmapConverter.ToWriteableBitmap(filteredFrame);
두 코드 모두 OpenCV의 Mat 형식의 이미지를 WPF의 Image 컨트롤에 표시하기 위해 사용하는 코드지만, 약간의 차이(Mat 객체를 WPF에서 사용할 수 있도록 변환하는 방식, 이미지 수정 가능성)가 있다.
imgDisplay.Source = frame.ToBitmapSource();
imgDisplay: XAML에서 정의한 Image 컨트롤의 이름이다.Source: Image 컨트롤에 표시할 이미지 소스를 지정하는 프로퍼티이다.frame: OpenCVSharp의 Mat 클래스 객체로, 이미지 데이터를 담고 있다.ToBitmapSource() 메서드: OpenCvSharp.WpfExtensions 네임스페이스에 있는 확장 메서드로, Mat 객체를 WPF에서 사용할 수 있는 BitmapSource 객체로 변환한다. BitmapSource는 WPF에서 이미지를 표시하기 위한 클래스이다.즉, 이 코드는 Mat 형식인frame에 저장된 이미지 데이터를 BitmapSource로 변환하여 imgDisplay 컨트롤에 표시한다.
( OpenCV의 Mat 형식의 이미지 데이터를 WPF의 Image 컨트롤에 표시하기 위해 BitmapSource 형식으로 변환하는 코드이다. 마치 디지털 카메라로 찍은 사진을 컴퓨터 화면에 보여주려면, 카메라가 사용하는 이미지 형식을 컴퓨터 화면이 이해할 수 있는 형식으로 바꿔야 하는 것과 같은 이치이다.)
imgDisplay.Source = WriteableBitmapConverter.ToWriteableBitmap(filteredFrame);
imgDisplay: XAML에서 정의한 Image 컨트롤의 이름이다.Source: Image 컨트롤에 표시할 이미지 소스를 지정하는 프로퍼티이다.filteredFrame: OpenCVSharp의 Mat 클래스 객체로, 필터링된 이미지 데이터를 담고 있다.WriteableBitmapConverter.ToWriteableBitmap() 메서드: OpenCvSharp.WpfExtensions 네임스페이스에 있는 WriteableBitmapConverter 클래스의 정적 메서드로, Mat 객체를 WPF에서 사용할 수 있는 WriteableBitmap 객체로 변환한다.즉, 이 코드는 filteredFrame에 저장된 이미지 데이터를 WriteableBitmap으로 변환하여 imgDisplay 컨트롤에 표시한다.
BitmapSource와 WriteableBitmap은 둘 다 WPF에서 이미지를 표시하는 데 사용되는 클래스이지만, WriteableBitmap은 픽셀 데이터에 직접 접근하여 수정할 수 있다는 장점이 있다. 따라서 이미지를 동적으로 변경해야 하는 경우 WriteableBitmap을 사용하는 것이 유리하다.
두 코드의 차이점은 ToBitmapSource() 메서드는 BitmapSource 객체를 반환하고, WriteableBitmapConverter.ToWriteableBitmap() 메서드는 WriteableBitmap 객체를 반환한다는 점이다.
Mat filteredFrame = frame.Clone(); 처럼 복사하는 과정
ToBitmapSource() 메서드는 Mat 객체의 이미지 데이터를 복사하여 새로운 BitmapSource 객체를 생성하기 때문에,
원본 Mat 객체(frame)를 수정해도 imgDisplay에 표시되는 이미지는 변경되지 않는다. 따라서 Mat filteredFrame = frame.Clone();과 같이 원본 Mat 객체를 복사할 필요가 없다.
반면에, WriteableBitmapConverter.ToWriteableBitmap() 메서드는 Mat 객체의 이미지 데이터를 공유하는 WriteableBitmap 객체를 생성한다.
따라서 원본 Mat 객체(filteredFrame)를 수정하면 imgDisplay에 표시되는 이미지도 변경된다.
만약 WriteableBitmapConverter.ToWriteableBitmap() 메서드를 사용하면서 원본 Mat 객체를 수정하지 않으려면, Mat filteredFrame = frame.Clone();과 같이 원본 Mat 객체를 복사해야 한다.
두 코드의 차이점은 ToBitmapSource() 메서드는 이미지 데이터를 복사하여 새로운 BitmapSource 객체를 생성하고, WriteableBitmapConverter.ToWriteableBitmap() 메서드는 이미지 데이터를 공유하는 WriteableBitmap 객체를 생성한다는 점이다.