1

我对以下代码有问题

namespace MyApp
{    
    public partial class PhotoWindow : Window
    {
        private Capture _capture;

        public PhotoWindow ()
        {
            InitializeComponent();    
            _capture = new Capture();

            if (_capture != null)
            {
                //<Image> in XAML
                CaptureSource.Width = 150;
                CaptureSource.Height = 180;

                _capture.ImageGrabbed += ProcessFrame;
                _capture.Start();                
            }

            Activated += (s, e) => _capture.Start();
            Closing += (s, e) =>
            {
                if (_capture == null) return;
                _capture.Stop();                
                _capture.Dispose();
            };
        }

        private void ProcessFrame(object sender, EventArgs e)
        {
            try
            {
                Image<Bgr, Byte> frame = _capture.RetrieveBgrFrame();                   
                CaptureSource.Source = Helper.ToBitmapSource(frame);
            }
            catch (Exception exception)
            {

                System.Windows.MessageBox.Show(exception.ToString());
            }
        }

    }
}

当我运行应用程序时,我System.InvalidOperationException: The thread that this call can not access this object because the owner is another thread在线得到异常CaptureSource.Source = Helper.ToBitmapSource(frame);

因为我可以解决这个问题?

4

2 回答 2

1

似乎 ImageGrabbed 事件是从 Capture 的后台线程引发的,因此您的处理程序在该线程中运行,而不是在窗口的 UI 线程中运行。

您可以使用 Dispatcher 在控件的 UI 线程中调用代码。

CaptureSource.Dispatcher.Invoke(() =>
{
   Image<Bgr, Byte> frame = _capture.RetrieveBgrFrame();                   
   CaptureSource.Source = Helper.ToBitmapSource(frame);
});
于 2013-01-26T16:17:23.313 回答
0

Emgu.CV.UI.ImageBox在 UI 中使用来显示来自 Capture 的 Image<,> 框架

Image<Bgr, Byte> frame = _capture.RetrieveBgrFrame();    
imageBox.Invoke(new Action(() => imageBox.Image = frame));
于 2015-11-26T08:19:10.127 回答