我正在创建一个WPF / C#应用程序,它使用kinect移动对象,但它也可以使用鼠标运行。目前我使用鼠标注释掉它的kinect代码。我需要知道kinect是否已连接,所以我不需要注释代码,以便在不使用鼠标时使用鼠标(不会像现在这样抛出异常),并且当它发生时使用kinect。 我该怎么办? info:我正在使用官方的Microsoft Kinect SDK(大约一周前下载)
Edit-- 我正在使用这些
using System;
using System.ComponentModel;
using System.Threading;
using System.Windows;
using System.Windows.Media;
using System.Windows.Input;
using System.Windows.Media.Media3D;
using System.Windows.Media.Animation;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using GridAnimationDemo;
using System.Windows.Threading;
using HtmlAgilityPack;
using System.Xml.Linq;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Net;
using Microsoft.Research.Kinect.Nui;
using Microsoft.Research.Kinect.Audio;
using Microsoft.Research.Kinect;
using Microsoft.Office.Interop.PowerPoint;
using System.Windows.Data;
using Microsoft.Research.Kinect.Samples.CursorControl;
using Coding4Fun.Kinect.Wpf;
using Coding4Fun;
using System.Speech.Synthesis;
无法添加引用并使用Microsoft.Kinect,因为它会与其中一些
产生冲突编辑 -
Device dvc = new Device();
if (dvc.Count.Equals(0))
MessageBox.Show("apoellin");
我尝试了上面的代码,如果我使用任何没有连接Kinect的Kinect代码,应用程序崩溃时会出现同样的错误崩溃
答案 0 :(得分:5)
以下是“使用Microsoft SDK开始使用Kinect编程”一书中的代码,该代码处理得很好
// (in your page/window constructor):
this.KinectDevice = KinectSensor.KinectSensors
.FirstOrDefault(x => x.Status == KinectStatus.Connected);
// (and create a property like this:)
public KinectSensor KinectDevice
{
get { return this._KinectDevice; }
set
{
if (this._KinectDevice != value)
{
//Uninitialize
if (this._KinectDevice != null)
{
this._KinectDevice.Stop();
this._KinectDevice.SkeletonFrameReady -= KinectDevice_SkeletonFrameReady;
this._KinectDevice.SkeletonStream.Disable();
this._FrameSkeletons = null;
}
this._KinectDevice = value;
//Initialize
if (this._KinectDevice != null)
{
if (this._KinectDevice.Status == KinectStatus.Connected)
{
this._KinectDevice.SkeletonStream.Enable();
this._FrameSkeletons = new
Skeleton[this._KinectDevice.SkeletonStream.FrameSkeletonArrayLength];
this.KinectDevice.SkeletonFrameReady +=
KinectDevice_SkeletonFrameReady;
ColorImageStream colorStream = this._KinectDevice.ColorStream;
colorStream.Enable();
this._ColorImageBitmap = new WriteableBitmap(colorStream.FrameWidth,
colorStream.FrameHeight, 96, 96, PixelFormats.Bgr32, null);
this._ColorImageBitmapRect = new Int32Rect(0, 0, colorStream.FrameWidth,
colorStream.FrameHeight);
this._ColorImageStride = colorStream.FrameWidth * colorStream.FrameBytesPerPixel;
ColorImageElement.Source = this._ColorImageBitmap;
this._KinectDevice.ColorFrameReady += Kinect_ColorFrameReady;
this.ColorImageElement.Dispatcher.BeginInvoke(new Action(() =>
{
this._ColorImageBitmap = new WriteableBitmap(colorStream.FrameWidth,
colorStream.FrameHeight,
96, 96, PixelFormats.Bgr32,
null);
this._ColorImageBitmapRect = new Int32Rect(0, 0, colorStream.FrameWidth,
colorStream.FrameHeight);
this._ColorImageStride = colorStream.FrameWidth *
colorStream.FrameBytesPerPixel;
this._ColorImagePixelData = new byte[colorStream.FramePixelDataLength];
this.ColorImageElement.Source = this._ColorImageBitmap;
}));
this._KinectDevice.Start();
}
}
}
}
}
答案 1 :(得分:2)
如果您使用的是最新的Windows SDK,则可以检查Runtime.Kinects.Count
的值。
如果值为0,则表示没有连接Kinects -
if (Runtime.Kinects.Count == 0)
{
// No Kinects are connected
}
else
{
// Kinect is connecetd
}
答案 2 :(得分:2)
您使用的是Kinect for Windows SDK的过时版本。 Microsoft.Research.Kinect
命名空间来自测试版。
最新的SDK可以在这里下载:
http://www.microsoft.com/en-us/kinectforwindows/develop/developer-downloads.aspx
执行此操作后,请下载Developer Toolkit,也可从上面的链接获得。它包含多个如何执行许多任务的示例。
我强烈建议查看Kinect Explorer示例。这将向您展示如何使用名为KinectSensorManager的数据容器。此类是数据包装器,不是SDK的一部分 - 它有助于管理Kinect传感器。它包含在几个Toolkit示例中。
除其他外,该类会在Kinect传感器状态发生变化时触发事件。因此,您可以将程序设置为在适当的事件处理程序中初始化和取消初始化Kinect。
答案 3 :(得分:2)
我想添加Kinect 2.0 SDK的答案。不幸的是,SDK不再具有Runtime
命名空间或列出设备的任何其他方式。但是,您可以使用WMI来确定是否已连接Kinect 2.0。
为此,您需要添加对System.Management库的引用。
public static bool IsConnected()
{
// Use WMI to find devices with the proper hardware id for the Kinect2
// note that one Kinect2 is listed as three harwdare devices
string query = String.Format(WmiQuery, HardwareId);
using (var searcher = new ManagementObjectSearcher(query))
{
using (var collection = searcher.Get())
{
return collection.Count > 0;
}
}
}
private const string HardwareId = @"VID_045E&PID_02C4";
private const string WmiQuery = @"SELECT * FROM Win32_PnPEntity WHERE DeviceID LIKE '%{0}%'";
更新,因为微软停止使用其Kinect 2 for Windows,现在使用Xbox One的Kinect for Windows,我们发现并非所有Kinect 2都使用相同的ID。目前我们使用这些ID。这似乎有效。
<!-- Kinect 2 For Xbox -->
USB\VID_045E&PID_02C4
<!-- Kinect 2 For Windows -->
USB\VID_045E&PID_02D9