2013-11-29 90 views
0

我第一次與kinect.toolbox一起啓動了kinect。我正在嘗試使用kinect.toolbox記錄器以及隨microsoft developer toolkit提供的用於kinect sdk v1.8的顏色基礎知識wpf c#。但是,當我點擊開始錄製按鈕時,它不會創建一個.recorded文件,如this answer中所述。你能幫我,告訴我我做錯了什麼嗎?用kinect工具箱記錄器啓動時出現故障

下面是我的代碼:

using Kinect.Toolbox.Record; 

namespace Microsoft.Samples.Kinect.ColorBasics 
{ 
    using System; 
    using System.Globalization; 
    using System.IO; 
    using System.Windows; 
    using System.Windows.Media; 
    using System.Windows.Media.Imaging; 
    using Microsoft.Kinect; 

    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     /// <summary> 
     /// Active Kinect sensor 
     /// </summary> 
     private KinectSensor sensor; 
     Stream recordStream; 
     KinectRecorder recorder; 

     /// <summary> 
     /// Bitmap that will hold color information 
     /// </summary> 
     private WriteableBitmap colorBitmap; 

     /// <summary> 
     /// Intermediate storage for the color data received from the camera 
     /// </summary> 
     private byte[] colorPixels; 

     /// <summary> 
     /// Initializes a new instance of the MainWindow class. 
     /// </summary> 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     /// <summary> 
     /// Execute startup tasks 
     /// </summary> 
     /// <param name="sender">object sending the event</param> 
     /// <param name="e">event arguments</param> 
     private void WindowLoaded(object sender, RoutedEventArgs e) 
     { 
      // Look through all sensors and start the first connected one. 
      // This requires that a Kinect is connected at the time of app startup. 
      // To make your app robust against plug/unplug, 
      // it is recommended to use KinectSensorChooser provided in Microsoft.Kinect.Toolkit (See components in Toolkit Browser). 
      foreach (var potentialSensor in KinectSensor.KinectSensors) 
      { 
       if (potentialSensor.Status == KinectStatus.Connected) 
       { 
        this.sensor = potentialSensor; 
        break; 
       } 
      } 

      if (null != this.sensor) 
      { 
       // Turn on the color stream to receive color frames 
       this.sensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30); 

       // Allocate space to put the pixels we'll receive 
       this.colorPixels = new byte[this.sensor.ColorStream.FramePixelDataLength]; 

       // This is the bitmap we'll display on-screen 
       this.colorBitmap = new WriteableBitmap(this.sensor.ColorStream.FrameWidth, this.sensor.ColorStream.FrameHeight, 96.0, 96.0, PixelFormats.Bgr32, null); 

       // Set the image we display to point to the bitmap where we'll put the image data 
       this.Image.Source = this.colorBitmap; 

       // Add an event handler to be called whenever there is new color frame data 
       this.sensor.ColorFrameReady += this.SensorColorFrameReady; 

       // Start the sensor! 
       try 
       { 
        this.sensor.Start(); 
       } 
       catch (IOException) 
       { 
        this.sensor = null; 
       } 
      } 

      if (null == this.sensor) 
      { 
       this.statusBarText.Text = Properties.Resources.NoKinectReady; 
      } 
     } 

     /// <summary> 
     /// Execute shutdown tasks 
     /// </summary> 
     /// <param name="sender">object sending the event</param> 
     /// <param name="e">event arguments</param> 
     private void WindowClosing(object sender, System.ComponentModel.CancelEventArgs e) 
     { 
      if (null != this.sensor) 
      { 
       this.sensor.Stop(); 
      } 
     } 

     /// <summary> 
     /// Event handler for Kinect sensor's ColorFrameReady event 
     /// </summary> 
     /// <param name="sender">object sending the event</param> 
     /// <param name="e">event arguments</param> 
     private void SensorColorFrameReady(object sender, ColorImageFrameReadyEventArgs e) 
     { 
      using (ColorImageFrame colorFrame = e.OpenColorImageFrame()) 
      { 
       if (colorFrame != null) 
       { 
        // Copy the pixel data from the image to a temporary array 
        colorFrame.CopyPixelDataTo(this.colorPixels); 

        // Write the pixel data into our bitmap 
        this.colorBitmap.WritePixels(
         new Int32Rect(0, 0, this.colorBitmap.PixelWidth, this.colorBitmap.PixelHeight), 
         this.colorPixels, 
         this.colorBitmap.PixelWidth * sizeof(int), 
         0); 
       } 
      } 
     } 

     /// <summary> 
     /// Handles the user clicking on the screenshot button 
     /// </summary> 
     /// <param name="sender">object sending the event</param> 
     /// <param name="e">event arguments</param> 
     private void ButtonScreenshotClick(object sender, RoutedEventArgs e) 
     { 
      if (null == this.sensor) 
      { 
       this.statusBarText.Text = Properties.Resources.ConnectDeviceFirst; 
       return; 
      } 

      // create a png bitmap encoder which knows how to save a .png file 
      BitmapEncoder encoder = new PngBitmapEncoder(); 

      // create frame from the writable bitmap and add to encoder 
      encoder.Frames.Add(BitmapFrame.Create(this.colorBitmap)); 

      string time = System.DateTime.Now.ToString("hh'-'mm'-'ss", CultureInfo.CurrentUICulture.DateTimeFormat); 

      string myPhotos = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures); 

      string path = Path.Combine(myPhotos, "KinectSnapshot-" + time + ".png"); 

      // write the new file to disk 
      try 
      { 
       using (FileStream fs = new FileStream(path, FileMode.Create)) 
       { 
        encoder.Save(fs); 
       } 

       this.statusBarText.Text = string.Format(CultureInfo.InvariantCulture, "{0} {1}", Properties.Resources.ScreenshotWriteSuccess, path); 
      } 
      catch (IOException) 
      { 
       this.statusBarText.Text = string.Format(CultureInfo.InvariantCulture, "{0} {1}", Properties.Resources.ScreenshotWriteFailed, path); 
      } 
     } 

     private void button_Start_Recording(object sender, RoutedEventArgs e) 
     { 
      string generatedName = Guid.NewGuid().ToString(); 
      string recordStreamPathAndName = @"C:\" + generatedName + ".recorded"; 
      this.recordStream = File.Create(recordStreamPathAndName); 
      this.recorder = new KinectRecorder(KinectRecordOptions.Color | KinectRecordOptions.Skeletons, recordStream); 
      button1.IsEnabled = false; 

     } 

     private void button_Stop_Recording(object sender, RoutedEventArgs e) 
     { 
      if (recorder != null) 
      { 
       recorder.Stop(); 
       recorder = null; 
       button1.IsEnabled = true; 
      } 
     } 
    } 
} 

回答

2

我不能看到調用this.recorder.Record(colorFrame)private void SensorColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)方法。嘗試添加此。

+0

如果我記得不錯,方法this.recorder.Record()接受顏色,骨架和深度幀類型。 – Ewerton

+0

是的,我得到它,但錄製的視頻是一個巨大的文件,803 MB幾秒鐘。任何方式來處理這個問題?我如何將它轉換爲可以在線播放的格式? – ivan

+0

要以已知的視頻格式捆綁數組彩色框架,我建議您使用第三方工具(我不知道任何人)。 – Ewerton