这是我第一次尝试制作一个使用 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
,也会在 DepthStream.Enable
处出错。所以我猜我只是在创建传感器时做错了什么?
希望它是小东西。 提前致谢:)
最佳答案
我没有看到任何明显的错误,但我之前也没有看到传感器以这种方式获取和设置。你看过Kinect for Windows Developer Toolkit吗?例子?有多个关于如何连接到 Kinect 的示例,一些只是暴力连接,而另一些则非常稳健。
例如,这是 SlideshowGestures-WPF 示例中连接代码的精简版:
public partial class MainWindow : Window
{
/// <summary>
/// Active Kinect sensor
/// </summary>
private KinectSensor sensor;
/// <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.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;
}
}
}
/// <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();
}
}
}
获取传感器的最简单方法是使用 KinectSensorChooser
类,它是 Microsoft.Kinect.Toolkit
命名空间的一部分。它为您完成所有工作。例如,这是我的设置的修剪版本:
public class MainViewModel : ViewModelBase
{
private readonly KinectSensorChooser _sensorChooser = new KinectSensorChooser();
/// <summary>
/// Initializes a new instance of the MainViewModel class.
/// </summary>
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 的更大示例使用工具包中的 KinectSensorManager
类,它位于 KinectWpfViewers
命名空间中:
public class MainViewModel : ViewModelBase
{
private readonly KinectSensorChooser _sensorChooser = new KinectSensorChooser();
/// <summary>
/// Initializes a new instance of the MainViewModel class.
/// </summary>
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<KinectSensor> args)
{
if (null != args.OldValue)
UninitializeKinectServices(args.OldValue);
if (null != args.NewValue)
InitializeKinectServices(KinectSensorManager, args.NewValue);
}
/// <summary>
/// Initialize Kinect based services.
/// </summary>
/// <param name="kinectSensorManager"></param>
/// <param name="sensor"></param>
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
// (e.g., SpeechRecognizer)
}
kinectSensorManager.ElevationAngle = Settings.Default.KinectAngle;
}
/// <summary>
/// Uninitialize all Kinect services that were initialized in InitializeKinectServices.
/// </summary>
/// <param name="sensor"></param>
private void UninitializeKinectServices(KinectSensor sensor)
{
sensor.SkeletonFrameReady -= this.OnSkeletonFrameReady;
}
#endregion Kinect Discovery & Setup
#region Properties
public KinectSensorManager KinectSensorManager { get; private set; }
#endregion Properties
}
所有这些额外代码的优点可以在工具包中的 KinectExplorer
示例中看到。简而言之 - 我可以使用这段代码管理多个 Kinect,拔下一个,程序就会切换到另一个。
关于c# - Kinect错误启用流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13852736/