65.9K
CodeProject 正在变化。 阅读更多。
Home

充分利用 C# 中的 Kinect SDK - 第 1 部分:初始化

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (10投票s)

2011年11月20日

Ms-PL

3分钟阅读

viewsIcon

55724

downloadIcon

1078

一系列关于使用 Kinect for Windows SDK 进行实验的文章。

引言

这是系列文章的第一部分,记录了我对 Kinect for Windows SDK 的实验。在前两三篇文章之后,本系列应该为初学者提供一个很好的入门指南,并为更高级的开发人员提供一个不错的参考。

系列目录

  1. 初始化
  2. ImageStreams(图像流)
  3. 即将推出……

背景

Kinect 最初是为微软的 XBOX 360 游戏机开发的传感器。它有一个普通的摄像机,一个用于深度检测的红外摄像机,以及一个麦克风阵列。您可以在 这里 找到有关 Kinect 及其 Windows SDK 的所有信息。

SDK 基础知识

要在您的应用程序中使用 SDK,您需要引用 Microsoft.Research.Kinect 程序集。它包含两个命名空间

  • Microsoft.Research.Kinect.Nui - 用于视觉特征
  • Microsoft.Research.Kinect.Audio - 用于音频特征

在这一点上,我将重点关注 SDK 的 NUI 部分及其功能

  • DepthStream - 深度传感器的接口
  • VideoStream - 摄像机的接口
  • SkeletonEngine - 用于跟踪最多两个人体骨骼的引擎
  • NuiCamera - 设备信息和控制(主要用于获取/设置仰角)

要开始编码,您需要使用 SDK 中的 Runtime 类。此类提供设备枚举和初始化的入口点。在大多数情况下,您只需要获取 Runtime 类的实例即可

Runtime rt = Runtime.Kinects[0];

这将使您可以控制系统中找到的第一个 Kinect。如果您连接了更多 Kinect,您将需要使用 Runtime.Kinects 集合来枚举设备

foreach (Runtime CurrentRuntime in Runtime.Kinects)
{
    // Do your stuff...
}

运行时初始化

无论您通过哪种方式获取对 Runtime 的引用,您都必须 Initialize() 它。忘记这样做将在访问 ImageStreamSkeletonEngine 时导致异常。

在调用 Initialize() 之前,您应该通过检查 Status 属性来检查运行时和设备的状态。文档将状态描述为

  • Connected - 传感器已完全连接并准备就绪。
  • Error - 发生错误。
  • Disconnected - 传感器未连接到 USB 连接器。
  • NotPowered - 传感器未通电。
  • NotReady - 传感器的某些部分尚未准备就绪。

只有当 StatusKinectStatus.Connected 时,您才应该继续。可以通过附加到 Runtime.Kinects.StatusChanged 事件来监视状态。

初始化后,将几个选项传递给 Runtime。根据文档,它们的含义非常简单

  • UseColor - 处理颜色信息。
  • UseDepth - 处理深度信息。
  • UseDepthAndPlayerIndex - 处理玩家索引。
  • UseSkeletalTracking - 处理骨骼跟踪数据。

不启用某些功能可能会导致性能变化。我稍后会尝试验证它。

接下来您应该做的是 Open() ImageStream。同样,忘记这样做将导致在访问帧时出现异常。提供错误的参数将导致 InvalidOperationException

CurrentRuntime.Initialize(RuntimeOptions.UseDepthAndPlayerIndex
                          | RuntimeOptions.UseSkeletalTracking
                          | RuntimeOptions.UseColor
                          );

CurrentRuntime.VideoStream.Open(ImageStreamType.Video, 2, 
               ImageResolution.Resolution1280x1024, ImageType.Color);
CurrentRuntime.DepthStream.Open(ImageStreamType.Depth, 2, 
               ImageResolution.Resolution320x240, ImageType.DepthAndPlayerIndex);

InfoTool

上面显示的代码片段取自我的第一个工作应用程序 - InfoTool。目前,此工具所做的只是

  • 枚举设备
  • 初始化所有设备
  • 打开 ImageStream
  • 显示在上述步骤中收集的所有信息

这是一个示例输出

InfoTool.PNG

此示例输出显示有一个 Kinect 可供使用,并且所有初始化都已成功执行。正如您所看到的,VideoStreamDepthStream 在启动时有一些不正确的参数,并通过调用 Open() 将其更改为正确的参数。

关注点

我的下一次实验将包括

  • 确定使用 ImageStreams 的最佳方法
  • 骨骼跟踪
  • 基准测试/性能调优

历史

  • 2011-11-20:初步提交。
  • 2012-01-06:添加系列目录并更新源代码(适用于整个系列)。
© . All rights reserved.