2011-01-21 3 views
3

Все, что я пытаюсь отобразить в кадре захваченных кадров в WPF. Я уже могу отображать изображение. Но не можете понять способ обработки событий? В WinForm это Application.Idle, но что я должен использовать в WPF? Я уже видел это thread .. Я не мог этого сделать.Захват камеры EMGU CV в WPF?

ответ

4

Почему вы не можете использовать Timer.Elapsed event?

Просто помните, что обратный вызов Elapsed происходит в Worker Thread, что делает невозможным обновление пользовательского интерфейса. Поэтому вы должны использовать SynchronizationContext, чтобы направить действия обновления пользовательского интерфейса в соответствующий поток.

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 событие:

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

Может быть, лучшим решением является сочетание обоих подходов: слушать диспетчерский бездействия, но не делают кадр до истечения определенного периода. –

+0

Как называется функция Timer_Elapsed? – Jonathan

+0

Вы настраиваете таймер с использованием класса Timer, который имеет событие Elapsed. https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx –

Смежные вопросы