OpenCv를 사용하여 캠 화면을 띄우는 방법에 대한 포스팅입니다.
들로네 님의 큰 도움이 있었습니다. ^^
들로네님 블로그 : http://blog.naver.com/tramper2
들로네님 운영 카페 : http://cafe.naver.com/opencvsharp.cafe
C#을 이용한 OpenCv와 DirectShow에 관한 유용한 정보가 많으니 들려보시면 많은 도움이 되실 겁니다.
캠의 목록 선택에 따라 화면을 보여주는 예제로
Timer를 이용하여 카메라의 각 프레임을 WriteableBitmap으로 변환하여 Image에 보여주는 방식입니다.
캠의 목록을 얻어오는 부분은 DirectShow를 사용하였습니다.
소스는 다음과 같습니다.
public partial class Window1 : Window { private CvCapture capture; private DispatcherTimer timer; private WriteableBitmap writeBitmap; private IplImage src;
public Window1() { InitializeComponent(); }
protected override void OnInitialized(EventArgs e) { base.OnInitialized(e);
// 캠 목록 얻어오기 foreach (DirectShowLib.DsDevice ds in DirectShowLib.DsDevice.GetDevicesOfCat (DirectShowLib.FilterCategory.VideoInputDevice)) { camList.Items.Add(ds.Name); }
SetTimer(); }
protected override void OnClosing(System.ComponentModel.CancelEventArgs e) { base.OnClosing(e);
if (capture != null) { capture.Dispose(); }
if (timer != null) { timer.Stop(); } }
private void initCamera(int camIndex) { try { // 해당 카메라 가져오기 capture = CvCapture.FromCamera(CaptureDevice.DShow, camIndex);
// 이미지에 비트맵 연결 writeBitmap = new WriteableBitmap(capture.FrameWidth, capture.FrameHeight, 96, 96, PixelFormats.Bgr24, null); camDisplay.Source = writeBitmap; } catch(Exception e) { if (timer != null) { timer.Stop(); }
if (capture != null) { capture.Dispose(); capture = null; } MessageBox.Show(e.ToString()); } }
private void SetTimer() { timer = new DispatcherTimer(); timer.Interval = new TimeSpan(0, 0, 0, 0, 33); timer.Tick += new EventHandler(TimerClock_Tick); }
void TimerClock_Tick(object sender, EventArgs e) { // 카메라의 프레임을 비트맵으로 변환 using (src = capture.QueryFrame()) { WriteableBitmapConverter.ToWriteableBitmap(src, writeBitmap); } }
private void btnStart_Click(object sender, RoutedEventArgs e) { if (capture != null && !timer.IsEnabled) { timer.IsEnabled = true; timer.Start(); } }
private void btnStop_Click(object sender, RoutedEventArgs e) { if (capture != null) { timer.IsEnabled = false; timer.Stop(); } }
private void camList_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { initCamera(camList.SelectedIndex); } } |
[ 결과 화면 ]
노트북이라 화질이 정말 안 좋군요. -_- ;;
필요한 사항들은 다음과 같습니다. (저는 모두 1.1 버전을 사용하였습니다. )
- OpenCV : http://sourceforge.net/projects/opencvlibrary/files/
- OpenCvShrap : http://cafe.naver.com/opencvsharp/481
※ 캡쳐보드를 사용하는 경우 화면이 멈추는 현상이 발생할 수 있습니다.
그럴 땐 캡쳐보드의 Deinterlace 속성을 변경시키거나 다른 옵션들을 보셔야 합니다.
'Window > WPF' 카테고리의 다른 글
[ WPF ] BackgroundWorker (2) | 2010.07.11 |
---|---|
[ WPF ] 윈도우 이벤트 (4) | 2010.07.11 |
[ WPF ] 이미지 그림판 (2) | 2010.05.08 |
[ WPF ] UI 쓰레드 변경하기 (0) | 2010.05.04 |
[ WPF ] WPF in Flash (0) | 2010.04.29 |