2013-01-05 4 views
1

Hy, Я пытаюсь преобразовать BitmapSource в Bitmap из Kinect RGB Color Stream. Я получаю null. Я использую Kinect для Windows SDK 1.6, Visual Studio 2012, Windows 7 Ultimate 64bit, EmguCV 2.4.2.1777. Вот код:BitmapSource to Bitmap Возвращает Null (EmguCV2.4.2.1777 + Kinect)

void _kinect_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e) 
    { 
     using (ColorImageFrame colorFrame = e.OpenColorImageFrame()) 
     { 
      if (colorFrame == null) 
      { 
       return; 
      } 

      if (colorFrame != null) 
      { 
       this.colorPixels = new byte[colorFrame.PixelDataLength]; 

       colorFrame.CopyPixelDataTo(this.colorPixels); 

       int stride = colorFrame.Width * 4; 

       colorBmp = BitmapSource.Create( 
        colorFrame.Width, 
        colorFrame.Height, 
        96, 
        96, 
        PixelFormats.Bgr32, 
        null, 
        colorPixels, 
        stride 
       ); 

       currentColorFrame = new Image<Bgr, Byte>(colorBmp.ToBitmap()); 

       this.imgOutput.Source = ImageHelpers.ToBitmapSource(currentColorFrame); 
      } 
     }   
    } 

Helper Методы:

public static System.Drawing.Bitmap ToBitmap(this BitmapSource bitmapsource) 
    { 
     System.Drawing.Bitmap bitmap; 
     using (var outStream = new MemoryStream()) 
     { 
      // from System.Media.BitmapImage to System.Drawing.Bitmap 
      BitmapEncoder enc = new BmpBitmapEncoder(); 
      enc.Frames.Add(BitmapFrame.Create(bitmapsource)); 
      enc.Save(outStream); 
      bitmap = new System.Drawing.Bitmap(outStream); 
      return bitmap; 
     }   
    } 


    [DllImport("gdi32")] 
    private static extern int DeleteObject(IntPtr o); 

    /// <summary> 
    /// Convert an IImage to a WPF BitmapSource. The result can be used in the Set Property of Image.Source 
    /// </summary> 
    /// <param name="image">The Emgu CV Image</param> 
    /// <returns>The equivalent BitmapSource</returns> 
    public static BitmapSource ToBitmapSource(IImage image) 
    { 
     using (System.Drawing.Bitmap source = image.Bitmap) 
     { 
      IntPtr ptr = source.GetHbitmap(); //obtain the Hbitmap 

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

      DeleteObject(ptr); //release the HBitmap 
      return bs; 
     } 
    } 

Пожалуйста, укажите свою ошибку или дать мне какие-либо предложения как можно скорее.

ответ

0

Попробуйте изменить оператор return в методе ToBitmap следующим образом. See also here.

return (Bitmap)Image.FromStream(stream) 

Имейте в виду, что CreateBitmapSourceFromHBitmap в вашем ToBitmapSource может вызвать утечку памяти. See this post. Существует много других способов преобразования Bitmap в BitmapSource, но для моего опыта никто не работает быстрее.

0

A quick search дал несколько ресурсов о том, как конвертировать BitmapSource в Bitmap.

Is there a good way to convert between BitmapSource and Bitmap?

http://snipplr.com/view/63090/how-to-convert-bitmapsource-to-bitmap/

https://gist.github.com/916300

Все они следуют общей темой, хоть чуть-чуть по-другому.

+0

Я сделал все это, прежде чем приходить сюда. :) Я не знаю, почему я получаю null.I думаю, это из-за EmguCV 2.4. В emguCV 2.3 он работает хорошо. – user1744936

+0

Это странно. Вы используете EmguCV для чего-либо еще или просто для этой операции? –

+0

Для обнаружения и распознавания. – user1744936

0

Как вы на 64-битной ОС, м надеясь, что вы сослались следующие файлы тоже (Для EMGU CV версии> = 2,4)

cudart64_42_9.dll, cvextern.dll, npp64_42_9.dll

Это поможет в использовании emgucv в 64-битной ОС, если вы не делаете 64-битную сборку. Кроме того, ваш код выглядит отлично.

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