2011-01-21 123 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

也許更好的解決方案是將兩種方法結合起來:聽調度員活動,但不渲染幀

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); } } } 

另外,因爲所有的UI任務經過調度,你可以在DispatcherInactive事件作出反應直到過了一段時間。 – 2011-01-22 17:03:07