2013-11-29 3 views
0

Я начинаю с kinect в первый раз вместе с kinect.toolbox. Я пытался использовать рекордер kinect.toolbox вместе с базой цветов wpf C#, предоставленной с помощью инструментария для разработчиков microsoft для kinect sdk v1.8. Однако, когда я нажимаю кнопку начала записи, она не создает файл .recorded, как описано в this answer. Не могли бы вы помочь мне и рассказать мне, что я делаю неправильно?Неисправность при запуске с помощью kinect toolbox recorder

Ниже мой код:

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 мб на несколько секунд. каким-либо образом справиться с этой проблемой? как я могу преобразовать его в формат, который можно было бы играть онлайн? – ivan

+0

Чтобы связать массив Color Frames в известном формате видео, я предлагаю вам использовать инструмент третьей части (я никого не знаю). – Ewerton

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

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