2012-08-26 49 views
3

我基本上是嘗試從Kinect for Windows採用與SDK中給出的相同代碼(ColorBasics示例)的RGB Stream輸入。Kinect for Windows輸入流

的實例的SDK的代碼如下

public partial class MainWindow : Window 
{ 
    /// <summary> 
    /// Active Kinect sensor 
    /// </summary> 
    private KinectSensor sensor; 

    /// <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 
     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("{0} {1}", Properties.Resources.ScreenshotWriteSuccess, path); 
     } 
     catch (IOException) 
     { 
      this.statusBarText.Text = string.Format("{0} {1}", Properties.Resources.ScreenshotWriteFailed, path); 
     } 
    } 
} 
} 

而且在我的應用程序的代碼如下

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using Microsoft.Kinect; 

namespace VideoKinect 
{ 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    private KinectSensor sensor; 

    private WriteableBitmap colorBitmap; 

    private byte[] colorPixels; 

    public MainWindow() 
    { 
     //InitializeComponent(); 
    } 

    private void WindowLoaded(object sender, RoutedEventArgs e) 
    { 
     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.ColorImage.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) 
     { 
      MessageBox.Show("No Kinect Available"); 
     } 


    } 

    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); 
      } 
     } 
    } 
} 
} 

但我在我的代碼獲取錯誤在「IOException異常」即使我將我的xaml文件中的圖像命名爲相同,圖像「ColorImage」也未被檢測到。

回答

3

我能夠用預期的行爲編譯和執行上面的代碼 - 唯一的變化是取消註釋InitializeComponent();並將<Image x:Name="ColorImage"/>添加到MainWindow.xaml。

IOException說什麼?你能否通過至少一個USB 2.0 bus - 1.1 has insufficient bandwidth來檢查你的Kinect傳感器是否連接正確?您是否也確定傳感器具有足夠的功率,因爲​​您需要kinect power supply cable。你可以隨時檢查SDK是否安裝正確,看看這個post

關於它沒有找到你的ColorImage重建解決方案應該解決這個問題,假設在XAML中Image的x:Name沒有拼寫錯誤。

0

當你註釋掉try ... catch聲明時,你在開始之後將sensor = null;留在那裏,意味着你沒有傳感器。你應該評論說出來。

 // What it should be: 
     // try 
     // { 
      this.sensor.Start(); 
     // } 
     // catch (IOException) 
     // { 
     // this.sensor = null; <- What it should be 
     // } 

     // What it is: 
     // try 
     // { 
      this.sensor.Start(); 
     // } 
     // catch (IOException) 
     // { 
      this.sensor = null; //turns sensor null, then SensorColorFrame 
           // never gets called, etc. 
     // } 

該行最終會破壞您所寫的任何Kinect程序。希望這可以幫助!

0

你遺漏了一個參考。你需要包括:

using System.IO;

在最高層。希望這可以幫助!