2015-03-12 7 views
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 Defenition приведены ниже

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; 

     } 
    } 
+0

использования JetBrains dot Memory для профилирования вашего приложения. Или отладчик памяти Visual Studio Ultimate, или громоздкий WinDbg и http://thinkexception.blogspot.de/2010/06/tool-to-bompare-two-windbg-dumpheap.html и https://github.com/Seikilos/ MemComparer – Samuel

+0

@Samuel thanks ... пока эти ссылки объясняют, как это происходит, о котором я уже знаю, я не нашел полезной для решения проблемы ... Я полностью меняю формат захвата, который решил проблему – Jagan

ответ

0

Лучший способ для захвата ... старая моя идея была слишком сложно .... нашел образец кода в stockoverflow

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; 
       }; 
      } 
     }