0

メモリが限界に達し、アプリケーションが動作を停止しました。タイマーで Runcamera を呼び出しました。解像度は 640*480 ですが、1920*1080 では問題があります。私は何が欠けていますか?

  public void RunCamera() 
    {
       imgWeb.Visibility = Visibility.Visible;

      capture1.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH, 1920);
      capture1.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT, 1080);
       currentFrame = capture1.QueryFrame();
       imgWeb.Source = ToBitmapSource(currentFrame);
    }

以下の ToBitmapSource 定義

public static BitmapSource ToBitmapSource(IImage image)
    {
        BitmapSource bs = null;
        using (System.Drawing.Bitmap source = image.Bitmap)
        {
            try
            {

                IntPtr ptr = source.GetHbitmap(); //obtain the Hbitmap

                bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                   ptr,
                   IntPtr.Zero,
                   Int32Rect.Empty,
                   System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());

                DeleteObject(ptr); //release the HBitmap
            }
            catch (Exception ex)
            {
                GC.Collect();
                GC.WaitForFullGCComplete();
            }
            return bs;

        }
    }
4

1 に答える 1

0

キャプチャするための最良の方法...私の古いアイデアは複雑すぎました....ストックオーバーフローでコードのサンプルを見つけました

using (Image<Bgr, byte> frame = capture1.QueryFrame())
       {
           if (frame != null)
           {
               using (var stream = new MemoryStream())
               {
                   // My way to display frame 
                   frame.Bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);

                   BitmapImage bitmap = new BitmapImage();
                   bitmap.BeginInit();
                   bitmap.StreamSource = new MemoryStream(stream.ToArray());
                   bitmap.EndInit();
                   imgWeb.Source = bitmap;
               };
           }
       }
于 2015-03-17T09:42:04.850 に答える