지난 포스팅에서 WPF OpenCV 프로젝트의 기본 틀을 만들었습니다. 이제 WPF OpenCV 프로젝트를 위한 핵심 엔진인 OpenCV 라이브러리를 설치하고, WPF의 디자인 패턴인 MVVM 구조를 잡는 작업을 진행하겠습니다 .
현업에서 검증 장비를 개발할 때, 알고리즘 파라미터를 UI에 즉각적으로 반영하는 것은 매우 중요합니다. 오늘 작성할 코드는 WPF OpenCV 프로젝트에서 반응 형 UI의 기초가 되는 부분입니다.
WPF OpenCV 프로젝트를 위한 OpenCvSharp4 설치 (NuGet)
C# WPF 환경에서 OpenCV를 사용하기 위해 가장 널리 쓰이는 OpenCvSharp4를 설치하겠습니다. Visual Studio의 NuGet 패키지 관리자를 사용하면 간편하게 설치할 수 있습니다 .
메뉴에서 **[NuGet 패키지 관리]**를 선택합니다 .
솔루션 탐색기에서 프로젝트(Vision_OpenCV_App)를 우 클릭합니다.

‘찾아보기’ 탭에서 OpenCvSharp4를 검색합니다 .

검색 결과 중 아래 3가지 패키지를 모두 설치합니다 .

1. OpenCvSharp4: 핵심 라이브러리
2. OpenCvSharp4.runtime.win: 윈도우용 런타임 (필수)
3. OpenCvSharp4.WpfExtensions: WPF 전용 확장 기능 (이미지 변환 등)
설치가 완료되면 솔루션 탐색기의 [종속성] > [패키지] 목록에서 설치된 항목들을 확인할 수 있습니다 .
MVVM 패턴을 위한 프로젝트 파일 구성
WPF의 장점을 극대화하기 위해 MVVM(Model-View-ViewModel) 패턴으로 프로젝트를 구성하겠습니다 . 유지보수와 확장성을 위해 꼭 필요한 구조입니다.
솔루션 탐색기에서 프로젝트 우클릭 후 **[추가] > [새 항목]**을 눌러 아래 3개의 클래스 파일(.cs)을 생성합니다 .
AlgorithmParameters.cs: 알고리즘 변수 및 속성 관리OpenCVService.cs: 실제 영상처리 로직 담당MainViewModel.cs: UI와 데이터를 연결하는 뷰모델

알고리즘 파라미터 클래스 구현 (AlgorithmParameters.cs)
영상처리에서 가장 빈번하게 수정되는 것이 ‘임계값(Threshold)’ 같은 파라미터입니다. 이 값들이 변할 때 UI(슬라이더 등)가 즉시 반응하도록 INotifyPropertyChanged 인터페이스를 구현해 보겠습니다 .
아래 코드를 AlgorithmParameters.cs에 작성합니다.
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace Vision_OpenCV_App
{
// 속성 변경 알림을 위한 부모 추상 클래스
public abstract class AlgorithmParameters : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
// [CallerMemberName]을 사용하여 속성 이름을 자동으로 감지
protected void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
// 이진화(Threshold) 처리를 위한 파라미터 클래스
public class ThresholdParams : AlgorithmParameters
{
private byte _thresholdValue = 128;
public byte ThresholdValue
{
get => _thresholdValue;
set
{
if (_thresholdValue == value) return;
_thresholdValue = value;
OnPropertyChanged(); // 값이 바뀌면 UI에 알림
}
}
private byte _thresholdMax = 255;
public byte ThresholdMax
{
get => _thresholdMax;
set
{
if (_thresholdMax == value) return;
_thresholdMax = value;
OnPropertyChanged();
}
}
}
}
코드 핵심 포인트: 왜 이렇게 짰을까?
1. [CallerMemberName]의 마법 OnPropertyChanged("ThresholdValue") 처럼 속성 이름을 일일이 문자열로 적지 않아도 됩니다. 컴파일러가 “아, 이 함수를 호출한 놈이 ThresholdValue구나” 하고 알아서 이름을 채워줍니다. 오타로 인한 버그를 획기적으로 줄여줍니다.
2. 값이 아닌 ‘이름’을 알린다 OnPropertyChanged는 변경된 **값(숫자)**을 전달하는 게 아니라, “ThresholdValue라는 이름을 가진 친구가 변했어요!”라고 소문을 내는 역할을 합니다 . 소문을 들은 WPF UI(슬라이더 등)가 “어? 나랑 연결된 앤데?” 하고 다시 찾아와서 최신 값을 가져가 화면을 갱신하는 원리입니다
🚀 다음 단계
이제 알고리즘 파라미터를 담을 그릇을 만들었습니다. 다음 포스팅에서는 실제 영상처리 로직을 담당할 OpenCVService.cs 코드를 작성하고, 이미지를 불러와서 처리하는 기능을 구현해 보겠습니다 .
궁금한 점은 댓글로 남겨주세요!