2012-08-31 2 views
4

Je tente d'enregistrer une image de capteur de profondeur kinect dans un fichier png. J'ai essayé de prendre ça avec mon appareil photo RVB et ça n'a pas posé de problème. Y a-t-il quelque chose que j'ai raté? P.S. J'utilise les fonctions de Kinect ToolKit pour l'affichage de l'image rgb et de l'image de profondeur.Capture de l'image de profondeur Kinect dans un fichier 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; 
     }} 

Répondre

2

solution à mon problème:

En utilisant ToolKit Kinect, ils ont effectivement fourni une fonction bitmap inscriptible qui me permet de saisir la WritableBitmap du ColorStreamManager ou DepthStreamManager en dehors. Mon erreur précédente était que puisque je n'utilisais pas les méthodes d'affichage innées de Kinect, l'writeablebitmap sera définitivement vide. Ceci est mes codes fixes.

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

Qu'est ce que cis dans 'wmp = cis.Bitmap; ' est-il un objet de classe de certaines bibliothèques ...? si oui, quelle bibliothèque? et aussi Référence dans solutioExplorer ..? Désolé pour une question aussi simple, mais je suis nouveau dans ce domaine .. – kAmol

2

Si vous utilisez le Coding4Fun Kinect toolkit, je crois que vous pouvez utiliser des objets ImageFrame. Vous pouvez convertir un ImageFrame object to Bitmap et de là, vous devriez être en mesure de save it as a PNG sans problèmes.

Un peu d'un long chemin à la solution mais je n'utilise pas actuellement la machine qui a mes trucs Kinect dessus.

Éditer: Si vous utilisez WinForms, vous pouvez simplement utiliser la méthode de la boîte à outils Coding4Fun ImageFrame.ToBitmap(), puis enregistrer en tant que PNG à partir de là.

Le code devrait ressembler à ceci:

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

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

    bmp.Dispose(); 
} 
+0

J'ai essayé ceci mais je ne semble pas fonctionner pour wpf. J'ai essayé les trucs de Coding4Fun avant mais je me suis éloigné parce que ce n'est vraiment pas assez détaillé pour certains trucs. – Bocky

+0

Vous avez raison, la bibliothèque Coding4Fun est bonne pour les choses simples. J'ai récemment utilisé WPF dans un projet Kinect et cela peut être une bonne chose pour certaines choses simples. Je ne pense pas pouvoir élargir ma réponse pour mieux vous aider. La meilleure des chances – bobble14988

+0

J'ai finalement réussi à le faire fonctionner. Merci mec. – Bocky

0

Vous ne même pas besoin de la WriteableBitmap. Juste le codeur avec un BitmapSource qui contient le 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; 
     }} 

ENVIRONNEMENT:

  • Visual Studio 2012 expriment
  • Microsoft.Kinect Bibliothèque 1.7.0.0
  • Encoder a besoin du système d'assemblage. Xaml
Questions connexes