2012-03-26 2 views
0

Я хотел бы использовать Kinect и EmguCV вместе. Мне удалось получить изображения из Kinect и создать объект Image EmguCV. Я запустил приложение на мгновение, и приложение сработало через некоторое время, потому что память не была выпущена должным образом.Kinect & EmguCV & GC

Маленькая часть кода получает изображения RGB-цвета от Kinect и преобразует их в цветные изображения HSV. Я не могу решить, где память не будет выпущена. Я использовал «Использование структур» так же, как примеры, которые я читал в Интернете и в некоторых книгах.

Я хотел бы получить несколько советов о том, что я делаю неправильно в коде, потому что я не очень знаком с C#, и я, должно быть, потянул мою ногу, преобразуя данные изображения. Я заинтересован в том, чтобы посмотреть другие проекты -simple-Kinect + EmguCV, я был бы очень благодарен, если вы порекомендуете их.

Заранее спасибо.

Это код:

private void showHSV(Bitmap bmp) 
    { 
     Image<Bgr, byte> img = new Image<Bgr, byte>(bmp); 
     Image<Hsv, byte> imgHsv = img.Convert<Hsv, byte>(); 

     Bitmap bmp2 = imgHsv.ToBitmap(); 

     image2.Source = sourceFromBitmap(bmp2); 
    } 


    private BitmapSource sourceFromBitmap(Bitmap bmp) 
    { 
     BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
      bmp.GetHbitmap(), 
      IntPtr.Zero, 
      System.Windows.Int32Rect.Empty, 
      BitmapSizeOptions.FromWidthAndHeight(bmp.Width, bmp.Height)); 

     return bs; 
    } 

    private void ColorImageReady(object sender, ColorImageFrameReadyEventArgs e) 
    { 
     using (ColorImageFrame imageFrame = e.OpenColorImageFrame()) 
     { 
      if (imageFrame != null) 
      { 
       byte[] pixelData = new byte[imageFrame.PixelDataLength]; 
       imageFrame.CopyPixelDataTo(pixelData); 

       BitmapSource bmp = BitmapImage.Create(imageFrame.Width, imageFrame.Height, 96, 96, PixelFormats.Bgr32, null, 
        pixelData, imageFrame.Width * imageFrame.BytesPerPixel); 

       image1.Source = bmp; 

       showHSV(bitmapFromSource(bmp)); 
      } 
      else 
      { 
       // imageFrame is null because the request did not arrive in time   } 
      } 
     } 
    } 

    private System.Drawing.Bitmap bitmapFromSource(BitmapSource bitmapsource) 
    { 
     System.Drawing.Bitmap bitmap; 

     using (System.IO.MemoryStream outStream = new System.IO.MemoryStream()) 
     { 
      BitmapEncoder enc = new BmpBitmapEncoder(); 
      enc.Frames.Add(BitmapFrame.Create(bitmapsource)); 
      enc.Save(outStream); 
      bitmap = new System.Drawing.Bitmap(outStream); 
     } 
     return bitmap; 
    } 

ответ

0

Там много неотчужденный Bitmaps, лежащих вокруг в коде, позвольте мне указать на них:

private void showHSV(Bitmap bmp) 
{ 
    Image<Bgr, byte> img = new Image<Bgr, byte>(bmp); // Not sure what Image<,> is, but I guess it needs disposing at some point 
    Image<Hsv, byte> imgHsv = img.Convert<Hsv, byte>(); // same here 

    Bitmap bmp2 = imgHsv.ToBitmap(); // bmp2 is never disposed in your code 
    var oldBmp = image2.Source; 
    image2.Source = sourceFromBitmap(bmp2); 
    oldBmp.Dispose() // try this 
} 


private BitmapSource sourceFromBitmap(Bitmap bmp) 
{ 
    BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
     bmp.GetHbitmap(), 
     IntPtr.Zero, 
     System.Windows.Int32Rect.Empty, 
     BitmapSizeOptions.FromWidthAndHeight(bmp.Width, bmp.Height)); 

    return bs; 
} 

private void ColorImageReady(object sender, ColorImageFrameReadyEventArgs e) 
{ 
    using (ColorImageFrame imageFrame = e.OpenColorImageFrame()) 
    { 
     if (imageFrame != null) 
     { 
      byte[] pixelData = new byte[imageFrame.PixelDataLength]; 
      imageFrame.CopyPixelDataTo(pixelData); 

      BitmapSource bmp = BitmapImage.Create(imageFrame.Width, imageFrame.Height, 96, 96, PixelFormats.Bgr32, null, 
       pixelData, imageFrame.Width * imageFrame.BytesPerPixel); // bmp never disposed 

      var oldBmp = image1.Source; 
      image1.Source = bmp; 
      oldBmp.Dispose(); // try so 

      showHSV(bitmapFromSource(bmp)); // what happens inside? bmp needs to be disposed at some point... 
     } 
     else 
     { 
      // imageFrame is null because the request did not arrive in time   } 
     } 
    } 
} 

private System.Drawing.Bitmap bitmapFromSource(BitmapSource bitmapsource) 
{ 
    System.Drawing.Bitmap bitmap; 

    using (System.IO.MemoryStream outStream = new System.IO.MemoryStream()) 
    { 
     BitmapEncoder enc = new BmpBitmapEncoder(); 
     enc.Frames.Add(BitmapFrame.Create(bitmapsource)); 
     enc.Save(outStream); 
     bitmap = new System.Drawing.Bitmap(outStream); 
    } 
    return bitmap; 
} 

Там, наверное, больше утечек. Основное правило: каждый доступный ресурс (например, Bitmap), созданный (любыми способами, все чистые функции, возвращающие Bitmaps, создает их), должен быть удален после того, как вы закончите с ними.

Имейте в виду, что вы никогда не должны уничтожать растровое изображение, если оно в настоящее время связано с каким-либо элементом управления или используется иначе. Замените его на новый, а затем утилизируйте старый.

+0

Спасибо, я попробую, как только смогу, и я прокомментирую. – honnix

+0

Я не могу скомпилировать oldBmp.Dispose(). Каким другим способом я мог бы распоряжаться изображениями? – honnix

+0

Какой тип oldBmp? Возможно, вам нужно отбросить его в Bitmap? –

 Смежные вопросы

  • Нет связанных вопросов^_^