Kinect错误启用流

这是我第一次尝试制作一个使用Kinect的程序,我不知道为什么我一直得到一个null错误。 也许有人更了解KinectSDK可以提供帮助吗?

 public ProjKinect() { InitializeComponent(); updateSensor(0);//set current sensor as 0 since we just started } public void updateSensor(int sensorI) { refreshSensors();//see if any new ones connected if (sensorI >= sensors.Length)//if it goes to end, then repeat { sensorI = 0; } currentSensorInt = sensorI; if (activeSensor != null && activeSensor.IsRunning) { activeSensor.Stop();//stop so we can cahnge } MessageBox.Show(sensors.Length + " Kinects Found"); activeSensor = KinectSensor.KinectSensors[currentSensorInt]; activeSensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30); //ERROR IS RIGHT HERE activeSensor.DepthStream.Enable(); activeSensor.SkeletonStream.Enable(); activeSensor.SkeletonFrameReady += runtime_SkeletonFrameReady; activeSensor.DepthFrameReady += runtime_DepthFrameReady; activeSensor.ColorFrameReady += runtime_ImageFrameReady; activeSensor.Start();//start the newly enabled one } public void refreshSensors() { sensors = KinectSensor.KinectSensors.ToArray(); } 

错误:

 Object reference not set to an instance of an object. 

顺便说一句,它说我连接了1个Kinect,所以我知道它至少认识到我有连接的东西。 如果我只说0而不是currentSensorInt它也不起作用。 如果我注释掉ColorStream.Enable ,则ColorStream.Enable 。 所以我猜我在创建传感器时做错了什么?

希望它有点小。 提前致谢 :)

我没有看到任何明显的错误,但我也没有看到过采集过的传感器并且之前完全按照这种方式设置。 您是否浏览过Kinect for Windows Developer Toolkit示例? 有多个如何连接到Kinect的例子,有些只是powershell连接而有些则非常强大。

例如,这是SlideshowGestures-WPF示例中连接代码的修剪版本:

 public partial class MainWindow : Window { ///  /// Active Kinect sensor ///  private KinectSensor sensor; ///  /// Execute startup tasks ///  /// object sending the event /// event arguments 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.InfraredResolution640x480Fps30); // 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; } } } ///  /// Execute shutdown tasks ///  /// object sending the event /// event arguments private void WindowClosing(object sender, System.ComponentModel.CancelEventArgs e) { if (null != this.sensor) { this.sensor.Stop(); } } } 

获取传感器的最简单方法是使用KinectSensorChooser类,它是Microsoft.Kinect.Toolkit命名空间的一部分。 它为您完成所有工作。 例如,这是我的设置的修剪版本:

 public class MainViewModel : ViewModelBase { private readonly KinectSensorChooser _sensorChooser = new KinectSensorChooser(); ///  /// Initializes a new instance of the MainViewModel class. ///  public MainViewModel(IDataService dataService) { if (IsInDesignMode) { // do something special, only for design mode } else { _sensorChooser.Start(); if (_sensorChooser.Kinect == null) { MessageBox.Show("Unable to detect an available Kinect Sensor"); Application.Current.Shutdown(); } } } 

而已。 我有一个传感器,我可以开始使用它。 我如何连接和控制Kinect的一个更大的例子是使用Toolkit中的KinectSensorManager类,它位于KinectWpfViewers命名空间中:

 public class MainViewModel : ViewModelBase { private readonly KinectSensorChooser _sensorChooser = new KinectSensorChooser(); ///  /// Initializes a new instance of the MainViewModel class. ///  public MainViewModel(IDataService dataService) { if (IsInDesignMode) { // do something special, only for design mode } else { KinectSensorManager = new KinectSensorManager(); KinectSensorManager.KinectSensorChanged += OnKinectSensorChanged; _sensorChooser.Start(); if (_sensorChooser.Kinect == null) { MessageBox.Show("Unable to detect an available Kinect Sensor"); Application.Current.Shutdown(); } // Bind the KinectSensor from the sensorChooser to the KinectSensor on the KinectSensorManager var kinectSensorBinding = new Binding("Kinect") { Source = _sensorChooser }; BindingOperations.SetBinding(this.KinectSensorManager, KinectSensorManager.KinectSensorProperty, kinectSensorBinding); } } #region Kinect Discovery & Setup private void OnKinectSensorChanged(object sender, KinectSensorManagerEventArgs args) { if (null != args.OldValue) UninitializeKinectServices(args.OldValue); if (null != args.NewValue) InitializeKinectServices(KinectSensorManager, args.NewValue); } ///  /// Initialize Kinect based services. ///  ///  ///  private void InitializeKinectServices(KinectSensorManager kinectSensorManager, KinectSensor sensor) { // configure the color stream kinectSensorManager.ColorFormat = ColorImageFormat.RgbResolution640x480Fps30; kinectSensorManager.ColorStreamEnabled = true; // configure the depth stream kinectSensorManager.DepthStreamEnabled = true; kinectSensorManager.TransformSmoothParameters = new TransformSmoothParameters { // as the smoothing value is increased responsiveness to the raw data // decreases; therefore, increased smoothing leads to increased latency. Smoothing = 0.5f, // higher value corrects toward the raw data more quickly, // a lower value corrects more slowly and appears smoother. Correction = 0.5f, // number of frames to predict into the future. Prediction = 0.5f, // determines how aggressively to remove jitter from the raw data. JitterRadius = 0.05f, // maximum radius (in meters) that filtered positions can deviate from raw data. MaxDeviationRadius = 0.04f }; // configure the skeleton stream sensor.SkeletonFrameReady += OnSkeletonFrameReady; kinectSensorManager.SkeletonStreamEnabled = true; // initialize the gesture recognizer _gestureController = new GestureController(); _gestureController.GestureRecognized += OnGestureRecognized; kinectSensorManager.KinectSensorEnabled = true; if (!kinectSensorManager.KinectSensorAppConflict) { // set up addition Kinect based services here // (eg, SpeechRecognizer) } kinectSensorManager.ElevationAngle = Settings.Default.KinectAngle; } ///  /// Uninitialize all Kinect services that were initialized in InitializeKinectServices. ///  ///  private void UninitializeKinectServices(KinectSensor sensor) { sensor.SkeletonFrameReady -= this.OnSkeletonFrameReady; } #endregion Kinect Discovery & Setup #region Properties public KinectSensorManager KinectSensorManager { get; private set; } #endregion Properties } 

所有这些额外代码的优点都可以在Toolkit的KinectExplorer示例中看到。 简而言之 – 我可以使用此代码管理多个Kinect,拔掉一个,程序只需切换到另一个。