2011-01-21 6 views
3

모두 캡쳐 된 프레임을 WPF로 표시하려고합니다. 이미 이미지를 표시 할 수 있습니다. 하지만 이벤트 처리 방법을 알아낼 수 없습니까? WinForm에서는 Application.Idle이지만 WPF에서는 무엇을 사용해야합니까? 나는 이것을 thread 이미 보았다. 나는 그것을 만들 수 없었다.EMGU CV 카메라 캡처 (WPF)?

답변

4

왜 Timer.Elapsed 이벤트를 사용할 수 없습니까?

작업자 스레드에서 경과 콜백이 발생하므로 UI를 업데이트 할 수 없게됩니다. 따라서 SynchronizationContext를 사용하여 UI 업데이트 작업을 적절한 스레드로 보내야합니다.

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     //... 
     this.Dispatcher.Hooks.DispatcherInactive += new EventHandler(Hooks_DispatcherInactive); 
    } 

    void Hooks_DispatcherInactive(object sender, EventArgs e) 
    { 
     using (Image<Bgr, byte> frame = capture.QueryFrame()) 
     { 
      if (frame != null) 
      { 
       using (var stream = new MemoryStream()) 
       { 
        // My way to display frame 
        frame.Bitmap.Save(stream, ImageFormat.Bmp); 

        BitmapImage bitmap = new BitmapImage(); 
        bitmap.BeginInit(); 
        bitmap.StreamSource = new MemoryStream(stream.ToArray()); 
        bitmap.EndInit(); 

        webcam.Source = bitmap; 
       }; 
      } 
     } 
    } 
+2

어쩌면 더 나은 솔루션이 두 방법을 결합하는 것입니다 : 디스패처 활동을 수신하지만, 프레임을 렌더링하지 않는 모든 UI 작업이 디스패처 통과로

private SynchronizationContext _context = SynchronizationContext.Current; void Timer_Elapsed(object sender, ElapsedEventArgs e) { using (Image<Bgr, byte> frame = capture.QueryFrame()) { if (frame != null) { this._context.Send(o => { using (var stream = new MemoryStream()) { // My way to display frame frame.Bitmap.Save(stream, ImageFormat.Bmp); BitmapImage bitmap = new BitmapImage(); bitmap.BeginInit(); bitmap.StreamSource = new MemoryStream(stream.ToArray()); bitmap.EndInit(); webcam.Source = bitmap; } }, null); } } } 

또는, 당신은 DispatcherInactive 이벤트에 반응 할 수 일정 기간이 경과 할 때까지 –

+0

Timer_Elapsed 함수는 어떻게 호출됩니까? – Jonathan

+0

Elapsed 이벤트가있는 Timer 클래스를 사용하여 타이머를 설정했습니다. https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx –

관련 문제