Kinect 开发 —— Kinect for windows SDK

开发 —— 基本的SDK和Windows 编程技巧(彩色图像视频流,深度图像视频流的采集,骨骼跟踪,音频处理,语音识别API)

深度数据,就是Kinect的精髓和灵魂,很多问题都转换为深度图像的模式识别问题

AForge.NET 是一套C#编写的Framework,提供计算机视觉,机器学习 www.aforgenet.com

图像处理需要消耗大量的计算资源,使用C#这类托管语言并不明智,应多使用OpenCV

应用层API详解

NUI API

Kinect Audio DMO :提供束波成形和音源定位功能

Windows Speech SDK : 提供音频,语音,多媒体API集以及微软的语言识别功能

 



Kinect 的核心 NUI API

最多支持4个Kinect设备连接在同一个计算机上,但应用程序只能指定其中一个Kinect启用“骨骼跟踪”功能。多个应用程序无法同时共用一个kinect传感器

1,获得 Kinect 实例

KinectSensor sensor=(from sensorToCheck inKinectSensor.KinectSensors where sensorToCheck.Status==KinectStatus.Connected select sensorToCheck).FirstOrDefault();

foreach(KinectSensor KinectSensor indexer KinectSensor.KinectSensors)
{
    if(KinectSensor.Status==KinectStatus.Connected)
    {
        KinectSensor=kienct;
        break;
    }
}

 

2,调用 KinectSensor.Start 方法初始化并启动Kinect 传感器

3,注册相关事件,(如视频流或深度数据到来的事件,骨骼跟踪事件,并基于这些事件调用SDK提供的API进行处理)

KinectSensor.ColorFrameReady

KinectSensor.DepthFrameReady

KinectSensor.SkeletonFrameReady

KinectSensor.AllFrameReady

4,调用KinectSensor.Stop 方法关闭Kinect传感器

 

Kinect NUI API 通过 “管道”的方式处理来自Kinect传感器的数据。在初始化时,应用程序指定它所需要的传感器数据。(色彩,深度,深度和用户编号,骨骼跟踪)

这些选项必须在初始化中设定,否则将无法使用数据。

 



Kinect Audio DMO

提高音频质量      波束成形

回声消除  回声抑制  自动增益控制(当用户靠近或远离麦克风时,自动增益算法使得声音振幅保持一致)   波束成形

Microsoft.Speech 类库的关键对象是 SpeechRecognitionEngine,负责从Kinect传感器获取降噪预处理过的音频数据流,然后分析和解释,从而进一步匹配出最合适的语音命令

SpeechRecognitionEngine 基于一定的语法表达来进行语音命令识别,Grammar 对象由一系列的单个单词或词组组成,由类GrammarBuilder来表达,语法可以基于选择Choices类和通配符来表达。

 



数据流概述

1,彩色图像数据

图像质量的高低将影响到Kinect传感器与计算机间的传输速率

应用程序可以设定彩色图像的编码格式,包括RGB,YUV两种编码

30帧每秒的传输速度和320*240的分辨率

2,用户分割数据

深度图像的每个像素由2字节,共16位组成

每个像素的高13位代表从Kinect红外摄像头到最近物体对象的距离,以毫米为单位

低3位字节表示被跟踪的用户索引编号,这3位字节会被转换为整数值类型,并不作为标志位

在代码编写过程中不要引用特定的“用户索引号”,即使针对同一个人,Kinect骨骼跟踪返回的“用户索引编号”也可能发生变化

通过 “用户分割数据”可以将用户深度图像从原始深度图像中分离出来,通过坐标映射,也可以进一步将用户彩色图像从原始彩色图像中分离出来 —— 达到“增强现实”的效果

3,深度图像数据

每一个像素包含了特定的距离信息

对于Kinect红外摄像头,可以通过 DepthImageStream.DepthRange枚举类型了解当前摄像头的工作模式:

TooFarDepth

TooNearDepth

UnknowDepth

深度图像的每个像素为16位,定义一个short数据来存储深度图像:

short[] depthPixelData=new showrt[depthFrame.PixelDataLength];
depthFrame.CopyPixelDataTo(depthPixelData);

对应深度图像中的每个点 p(X,Y),depthFrame.Width为深度图像宽度,通过位运算来计算某个像素所表达的目标物体与Kinect的距离

Int32 depth = depthPixelData[pixelIndex]>>DepthImageFrame.PlayerIndexBitmaskWidth;

 



如何获取数据流

1,轮询模(拉)

首先开启图像数据流,然后请求帧数据并设置等待时间为T,单位为毫秒;如果帧数据尚未就绪,则系统将等待T时间后返回。如果帧数据成功返回,则应用程序可请求下一帧数据,并在同一线程执行其他操作

OpenNextFrame(T)  T—— 等待新数据返回的最长时间

2,事件模型

应用程序注册数据流的FrameReady事件,当事件触发时,将会调用事件的属性 FrameReadyEventArgs 来获取数据帧

不能对同一数据流同时使用者两种模式

AllFrameReady 事件包括了三种数据流,如应用程序注册了AllFrameReady事件,任何试图以采用“拉”(轮询)的方式获取流中的数据都会产生 InvalidOperationException

在某些应用中,为了保持深度图像和彩色图像尽可能的同步,可以采用轮询模式 —— 通过 Timestamp属性



骨骼跟踪

骨骼信息检索

1,轮询模式  SkeletonStream.OpenNextFrame

2,事件模型  KinectSensor.AllFramesReady 事件,一旦新的骨骼数据准备好,该事件触发,调用 SkeletonFrameReadyEventArgs.OpenSkeletonFrame 来获取该帧

骨骼跟踪对象选择

如果需要手动选择跟踪对象,需要使用 AppChoosesSkeletons 属性 和ChooseSkeletons 方法。



NUI 坐标转换

MapDepthToColorImagePoint —— 深度图像坐标系——彩色图像坐标系

MapDepthToSkeletonPoint  ——  深度图像坐标系 —— 骨骼跟踪坐标系

MapSkeletonPointToColor —— 骨骼跟踪坐标系 —— 彩色图像坐标系

MapSkeletonPointToDepth ——骨骼跟踪坐标系——深度图像坐标系

即使使用同样的分辨率,深度图象帧的像素也无法一一对应到彩色图像帧中去 —— 因为两个摄像头位于Kinect的不同位置

深度图像帧的DepthImageFrame类中有3个坐标转换方法

MapFromSkeletonPoint 将骨骼关节点坐标映射为深度图像点坐标

MapToColorImagePoint 将深度图像中的某点坐标映射为同步对应的彩色图像帧的点坐标

MapToSkeletonPoint 将审图图像中的某点坐标映射为同步对应的骨骼数据帧的点坐标

 

 

Z轴表示红外摄像头光轴,与图像平面垂直。光轴与图像平面的交点,即为图像坐标系的原点

深度图像坐标系和骨骼跟踪坐标系都是Kinect摄像头坐标系,原点为红外摄像头中心,X轴Y轴与图像的X轴Y轴平行,Z轴位红外摄像头光轴,它与图像平面垂直

屏幕坐标系 —— 左上角为原点,X轴向右为正,Y轴向下为正

深度图像空间坐标 —— 以毫米为单位

骨骼空间坐标 —— 以米为单位

 

传感器阵列和倾斜补偿

每个骨骼帧都包括一个描述重力的值。该值是由内部的三轴加速度计和传感器图像测量来配合计算得到的。在运动情况下,加速度计测量重力的方向,并将其余水平垂直的的向量

骨骼镜像

SDK 中没有提供非镜像的骨骼跟踪

实现镜像骨骼很简单 —— 反转骨骼节点的eX坐标值就可以实现此效果

Kinect 开发 —— Kinect for windows SDK

时间: 2024-10-25 13:55:11

Kinect 开发 —— Kinect for windows SDK的相关文章

Kinect 开发 —— Kinect studio

This tool can record all the data coming into an application from a Kinect unit. You can then view, review and store the data. Kinect Studio lets you inject the captured data streams back into a Kinect-enabled application, allowing you to test your c

基于XP打造windows7的C++开发平台--vs2010+windows SDK for windows7

IT业是一个创造奇迹的行业,IT业也是一个年轻的行业,IT业更是一个不断更新的行业.在今年2009年,微软已经连续推出visual studio2010 beta1 与 visual studio2010 beta2 两个版本.在2010.2月就要推出正式版了,beta版本已经展示了visual studio2010的所有新特性与革新,自从visual studio 2002推出以来,visual studio 2002 -> 2003 ->2005 ->2008 ->2010,产

Kinect 开发 —— 杂一

Kinect 提供了非托管(C++)和托管(.NET)两种开发方式的SDK,如果您用C++开发的话,需要安装Speech Runtime(V11),Kinect for Windows Runtime和驱动的,如果您使用C#和VB.NET的话,需要Microsoft.Kinect.dll和Mirosoft.Speech.dll两个dll,这两个其实是对前C++里面的两个dll的.NET封装,不论何种开发,您都需要安装driver,所有这些都包含在Kinect SDK安装包中,安装方法您可以参考之

Kinect for Windows SDK v2.0 开发笔记 (十一) 高清面部帧(2) 面部特征对齐

(转载请注明出处) 使用SDK: Kinect for Windows SDK v2.0 public preview1408 根据前一节的说明,这节就是关于面部特征对齐的. 接口为IFaceAlignment,因为SDK还在Beta中,提供官网的连接可能会失效,所以不提供了. 需要可以到微软官方查询.目前,面部特征对齐主要可以干: 0. 获取面部外框 -- 面部帧也能.但是经测试,精度高得多,抖动大概在几像素内 1. 获取头部旋转中心 --结果是一个相机空间坐标,大致位置就是颈部中心 2. 获

Kinect for Windows SDK v2.0 开发笔记 (十五) 手势帧

 (转载请注明出处) 使用SDK: Kinect for Windows SDK v2.0 public preview1409 同前面,因为SDK未完成,不附上函数/方法/接口的超链接. 这次终于是新的东西了,是"手势帧",不过原名是"可视化手势构建器"(Visual Gesture Builder)帧,是 SDK 2.0自带的手势解决方案,不过,如果您觉得微软写得不可靠,甚至垃圾,您可以尝试自己写个,笔者在 提供的范例中,写了个简单的样子(几十行而已,不要期

Kinect for Windows SDK v2.0 开发笔记 (十三) 高清面部帧(4) 面部模型构建器

 (转载请注明出处) 使用SDK: Kinect for Windows SDK v2.0 public preview1409 同前面,因为SDK未完成,不附上函数/方法/接口的超链接. 这次让我们让面部捕捉更加稳定/精确吧! 自从一直8月有了高清面部帧的例子后,觉得IFaceModel::GetFaceShapeDeformations它不干正事,一直返回0.0f的数据. 与其他开发者简单交流后,发现了问题的根本所在,需要面部模型构建器(IFaceModelBuilder). 好了,那么

Kinect for Windows SDK v2.0 开发笔记 (十六) SDK2.0正式发布 与 自带工具

(转载请注明出处) 使用SDK: Kinect for Windows SDK v2.0 1409 来了,微软于10月22日正式发布了SDK v2.0,前兆是发现了API文档正常了... 话说为什么是1409而不是1410 于是从这节开始,开始附上API的超链接.正式版的体积也是可观,整整(比7月版)大了一倍 这节说说自带的软件,本打算录下来,但是太懒了 先附上微软自己的地址,Part1,Part2,这是手势的,虽然是使用C#,不过工具使用是完全一样的. 先看看SDK中自带的工具: 0. Kin

Kinect for Windows SDK v2.0 开发笔记 (十七) 深度帧3D

 (转载请注明出处) 使用SDK: Kinect for Windows SDK v2.0 1409 这节算是补充节吧,以3D方式显示深度帧,SDK更新的则在后面的章节说明. 之前想错了,以为每帧显示所谓的点云,GPU负担很大, 背景每帧都要传送 500 * 400 * 3 * 4 , 才2M的数据,之前估计错了. 3D接口依然是D3D11,这次简单多了,顺带复习一下吧 要点: 0. 初始化..  仅仅需要: IKinectSensor(使用 GetDefaultKinectSensor)

【Kinect开发笔记之(二)】Kinect for windows发展历程

新版本SDK和旧版本的SDK完全兼容,如果您之前安装过旧版本的,可以直接安装新版本的SDK,但是如果您之前的开发版本是Beta版的,则需要卸载之后再安装新版本.在Kinect for Windows SDK 1.0版本中,SDK和示例文件是打包一起安装的.而在之后的版本,为了可以分别升级,微软把这两者分开独立为Kinect for Windows SDK和Kinect for Windows Developer Toolkit这两部分,所以需要分别下载安装, Kinect for Windows