2012-08-31 79 views
4

我想將一個kinect深度傳感器圖像保存到一個PNG文件。我試圖用我的RGB相機,並沒有任何問題。有什麼我錯過了嗎? P.S.我正在使用Kinect ToolKit的rgb和深度圖像顯示功能。捕獲Kinect深度圖像到PNG文件

WriteableBitmap depthBitmap; 
DepthStreamManager dsm; 
dsm = new DepthStreamManager(); 
kinect.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30); 
kinect.DepthFrameReady += kinect_DepthFrameReady; 
depthBitmap = new WriteableBitmap(kinect.DepthStream.FrameWidth,this.kinect.DepthStream.FrameHeight, 96.0, 96.0, PixelFormats.Gray16, null); 
private string TakeImage(int x) 
    { 
     if (x == 0) 
     { 
      BitmapEncoder encoder = new PngBitmapEncoder(); 
      encoder.Frames.Add(BitmapFrame.Create(this.depthBitmap)); 
      string myPhotos = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 
      string path = System.IO.Path.Combine(myPhotos, "Image 1.png"); 
      try 
      { 
       using (FileStream fs = new FileStream(path, FileMode.Create)) 
       { 
        encoder.Save(fs); 
       } 


      } 
      catch (IOException details) 
      { 
       Console.Write(details.ToString()); 

      } 
      if (path == null) 
       return "Image was not taken."; 
      else 
       return path; 
     }} 

回答

2

解決我自己的問題:

使用Kinect的工具包,他們實際上提供的可寫的位圖功能,可以讓我搶ColorStreamManager或DepthStreamManager的WritableBitmap出。之前我的錯誤是因爲我沒有使用Kinect的先天顯示方法,所以writeablebitmap肯定是空的。這是我的固定代碼。

WriteableBitmap wmp; 
      wmp = cis.Bitmap; 
      BitmapEncoder encoder = new PngBitmapEncoder(); 
      encoder.Frames.Add(BitmapFrame.Create(wmp)); 
      string path = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),"Image 1.png"); 
      try 
      { 
       using (FileStream fs = new FileStream(path, FileMode.Create)) 
       { 
        encoder.Save(fs); 
       } 
      } 
      catch (IOException ioe) 
      { 
       Console.WriteLine(ioe.ToString()); 
      } 
      return path; 
+0

什麼是順式'wmp = cis.Bitmap; ' 是來自某個庫的任何類對象...? 如果是這樣的庫?並參考solutioExplorer ..? 對不起,這是一個基本的問題,但我是新來的這個領域.. – kAmol

2

如果您使用Coding4Fun Kinect toolkit,我相信您可以使用ImageFrame對象。你可以轉換一個ImageFrame object to Bitmap,從那裏你應該能夠save it as a PNG沒有問題。

該解決方案的冗長路線的位,但我目前沒有使用我的Kinect的東西的機器。

編輯:如果您使用WinForms,您可以簡單地使用Coding4Fun工具包方法ImageFrame.ToBitmap(),然後從那裏保存爲PNG。

代碼應該是這個樣子:

private void saveAsPNG(ImageFrame myImageFrame, string path) 
{ 
    Bitmap bmp = myImageFrame.ToBitmap(); 

    bmp.Save(path, System.Drawing.Imaging.ImageFormat.Png); 

    bmp.Dispose(); 
} 
+0

我試過這個,但我似乎沒有爲wpf工作。我之前試過Coding4Fun的東西,但是我搬走了,因爲它對於某些東西來說確實不夠詳細。 – Bocky

+0

你說得對,Coding4Fun圖書館只適用於基本的東西。我最近在一個Kinect項目中使用了WPF,對於一些簡單的事情來說這可能是一種正確的痛苦。就在我頭頂,我不認爲我可以擴大我的答案來幫助你。祝你好運。 – bobble14988

+0

我終於搞定了。謝啦。 – Bocky

0

你甚至都不需要WriteableBitmap的。只是編碼器BitmapSource,它包含pixeldata

using Microsoft.Kinect; 
using System.Windows.Media; // WindowsBase 
using System.Windows.Media.Imaging; //PresentationCore 

...

static void sensor_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e) 
    { 

     DepthImageFrame DIF = e.OpenDepthImageFrame(); 
     if (DIF == null){return;}    

     short[] pixels = new short[DIF.PixelDataLength]; 
     DIF.CopyPixelDataTo(pixels); 

     if (check == 0) 
     { 
      int stride = DIF.Width * DIF.BytesPerPixel; 
      BitmapEncoder encoder = new PngBitmapEncoder(); 
      encoder.Frames.Add(BitmapFrame.Create(BitmapSource.Create(
       DIF.Width, DIF.Height, 96, 96, PixelFormats.Gray16, null, pixels, stride))); 

      string path = System.IO.Path.Combine(
       Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "kimage.png"); 

      try 
      { 
       using (FileStream fs = new FileStream(path, FileMode.Create)) 
       { 
        encoder.Save(fs); 
       } 
      } 
      catch (IOException ioe) 
      { 
       Console.WriteLine(ioe.ToString()); 
      } 
      check = 1; 
     }} 

環境:

  • 的Visual Studio 2012表達
  • Microsoft.Kinect圖書館1.7.0.0
  • 編碼需要組裝系統。 Xaml