1

我正在创建一个 WPF/C# 应用程序,它使用 kinect 来移动对象,但它也可以使用鼠标运行。目前我注释掉了 kinect 代码,因为它可以使用鼠标工作。我需要识别 kinect 是否已连接的方法,因此我不必注释掉代码以在未连接时使用鼠标(不会像当前那样抛出异常)并在连接时使用 kinect。我该怎么做?信息:我正在使用官方的 Microsoft Kinect SDK(大约一周前下载)

编辑——我正在使用这些

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 代码,应用程序会崩溃并出现相同的错误

4

4 回答 4

5

这是《Beginning Kinect Programming with the Microsoft SDK》一书中的代码,它很好地处理了这个问题

// (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();
}
}
}
}
}
于 2012-11-16T17:26:32.267 回答
2

您使用的是非常过时的 Kinect for Windows SDK 版本。命名空间来自Microsoft.Research.Kinect测试版。

最新的 SDK 可以在这里下载:

http://www.microsoft.com/en-us/kinectforwindows/develop/developer-downloads.aspx

完成之后,下载开发者工具包,也可以从上面的链接获得。它包含如何执行许多任务的多个示例。

我强烈建议查看 Kinect Explorer 示例。这将向您展示如何使用名为 KinectSensorManager 的数据容器。此类是数据包装器,而不是 SDK 的一部分——它有助于管理 Kinect 传感器。它包含在几个 Toolkit 示例中。

除其他外,该类会在 Kinect 传感器状态更改时触发事件。因此,您可以将程序设置为在适当的事件处理程序中初始化和取消初始化 Kinect。

于 2012-11-13T14:59:17.070 回答
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}%'";

更新,由于微软停止了其 Windows 版 Kinect 2,现在使用 Xbox One 的 Windows 版 Kinect,我们发现并非所有 Kinect 2 都使用相同的 ID。目前我们使用这些 ID。这似乎有效。

<!-- Kinect 2 For Xbox -->
USB\VID_045E&PID_02C4
<!-- Kinect 2 For Windows -->
USB\VID_045E&PID_02D9
于 2015-01-29T11:07:21.920 回答
2

如果您使用的是最新的 Windows SDK,您可以检查Runtime.Kinects.Count.

如果值为 0,则没有连接 Kinect -

if (Runtime.Kinects.Count == 0)
{
    // No Kinects are connected
}
else
{
    // Kinect is connecetd
}
于 2012-11-13T12:10:00.367 回答