【问题标题】:Emgu.CV Capture class throws exceptionEmgu.CV Capture 类抛出异常
【发布时间】:2014-08-29 13:10:41
【问题描述】:

我正在尝试创建一个 WPF 应用程序,它允许我逐帧单击视频。我正在使用 Emgu.CV 框架 Capture 类。我可以点击 20 到 30 帧然后它停止工作。

基本上我正在做的是单击一个开始捕获的按钮 Capture.Start()。在帧处理程序中,我抓取帧并调用 Capture.Pause()。我再次单击按钮以再次开始该过程。我可以这样做一段时间,他们停止工作。如果只是开始捕获并且不暂停并重新启动它,我可以一直播放视频。 这是我正在使用的代码。

    private void btnCapture_Click(object sender, RoutedEventArgs e) {
        capture = new Capture("C:\\AAAAA\\testVideo.mp4");
        capture.ImageGrabbed += ProcessFrame;
        webCamDisplay.DataContext = webCamManager;
        capture.Start();
    }
    private void btnNextFrame_Click(object sender, RoutedEventArgs e) {
        try {
            capture.Start();
        } catch (Exception ex ) {   
            string msg = ex.Message;
        }
    } 
    private void ProcessFrame(object sender, EventArgs arg) {
        try {
            Image<Bgr, Byte> frame = capture.RetrieveBgrFrame();
            try {
                this.Dispatcher.Invoke((Action)(() => {
                    webCamDisplay.Source = BitmapSourceConvert.ToBitmapSource(frame);
                    webCamManager.Update(frame);
                }));
            } catch (Exception ex) {
                string msg = ex.Message;
            }
            capture.Pause();
        } catch (Exception ex) {                
            string msg = ex.Message;
        }
    }

public class BitmapSourceConvert {
    public static BitmapImage ToBitmapSource(IImage image) {
        using (System.Drawing.Bitmap source = image.Bitmap) {
            System.Windows.Media.Imaging.BitmapImage bImg = new System.Windows.Media.Imaging.BitmapImage();
            try {
                MemoryStream ms = new MemoryStream();
                source.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                bImg.BeginInit();
                bImg.StreamSource = new MemoryStream(ms.ToArray());
                bImg.EndInit();
                return bImg;
            } catch (Exception ex) {
                string ms = ex.Message;
                throw new Exception(ms);
            }
        }
    }
}

【问题讨论】:

  • 你遇到了什么异常。
  • 您有 2 个错误 1) 设置 bImg.CacheOption = BitmapCacheOption.OnLoad; 2) 将 using 添加到 MemoryStream ms = new MemoryStream()
  • 例外是“堆已损坏”。我把你的改变,仍然得到错误。感谢您的回复。
  • 我也会在这一行得到“System.AccessViolationException”异常,source.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
  • 在这一行删除using using (System.Drawing.Bitmap source = image.Bitmap)。因为你在处理后使用frame。并在这一行添加usingImage&lt;Bgr, Byte&gt; frame = capture.RetrieveBgrFrame();

标签: c# wpf opencv emgucv


【解决方案1】:

我认为问题出在this.Dispatcher.Invoke 中,它在另一个线程中执行。尝试将capture 放入Invoke

private void ProcessFrame(object sender, EventArgs arg) {

            this.Dispatcher.Invoke((Action)(() => {
              try 
              {
                using(var frame = capture.RetrieveBgrFrame())
                {
                          webCamDisplay.Source = BitmapSourceConvert.ToBitmapSource(frame);
                          webCamManager.Update(frame);
                }
                capture.Pause();
              } 
              catch (Exception ex) 
              {
                      string msg = ex.Message;
              }
            }));

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2013-08-17
    • 2011-02-07
    • 1970-01-01
    相关资源
    最近更新 更多