Захват камеры EMGU CV в WPF? - PullRequest
3 голосов
/ 21 января 2011

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

1 Ответ

5 голосов
/ 22 января 2011

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

Просто помните, что обратный вызов 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);
            }
        }
    }

В качестве альтернативы, поскольку все задачи пользовательского интерфейса проходят через Dispatcher, вы можете отреагировать на событие 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;
                };
            }
        }
    }
...