Kinect for Windows Input Stream



我基本上是在尝试使用SDK中给出的相同代码(ColorBasics示例)从Kinect for Windows将输入作为RGB流。

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"处收到错误,并且没有检测到图像"ColorImage",尽管我在xaml文件中将图像命名为相同的图像。

我能够按照预期的行为编译和执行上面的代码-唯一的变化是取消对InitializeComponent();的注释,并将<Image x:Name="ColorImage"/>添加到MainWindow.xaml中。

IOException到底说了什么?您能再次检查Kinect传感器是否通过至少一条USB 2.0总线正确连接吗?1.1的带宽不足?您是否也确定传感器有足够的电源,因为您需要kinect电源电缆。你可以随时检查SDK是否安装正确,看看这篇文章。

关于找不到ColorImage,重建解决方案应该可以解决问题,假设XAML中图像的x:Name没有拼写错误。

当你注释掉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程序。希望这能有所帮助!

您遗漏了一个引用。您需要包括:

using System.IO;

在最顶端。希望这有帮助!

相关内容

最新更新