Kinect for Windows SDK

骨骼追踪 —— 对在Kinect视野范围内移动的一个或两个人进行骨骼追踪,可追踪到人体的20个节点

深度摄像头 —— 通过深度传感器获取到视野内的环境三维位置信息 (深度图像 —— 每个像素为距离Kinect传感器的距离) —— 利用Kinect红外发射器发出的红外线对空间进行编码,无论环境光线如何都不会影响测量结果

音频处理 —— 与 Microsoft Speech 语音识别API集成


Kinect 彩色和红外图像数据的处理

彩色图像质量 —— 普通质量和高质量 —— 决定数据从Kinect 传输到PC的速度

普通质量 —— 在传递给应用控制台之前会在传感器端进行压缩,接着在控制台解压数据 —— 图像压缩使得返回的彩色数据的帧频达30,但是会降低图像质量

高质量 —— 直接传递给控制台,不压缩,最大帧率不会超过15

彩色数据可以选择两种色彩格式 —— RGB YUV

彩色图像类型用枚举类型 ColorImageFormat 表示


红外数据流

原理:Kinect 首先通过左侧的红外线发射器向环境中发射红外线,这束红外线由于具有高度随机性,其在空间中任意两个不同位置所反射形成的光斑都不相同,对环境形成立体的“光编码”,再通过右侧的红外线接收器采集Kinect视野中的红外线图像,最终,利用这幅红外图像和kinect的原始参数进行一系列复杂的计算,得到视野中的三维深度信息

KinectSensor 类提供了一些接口,用于管理Kinect设备的开关以及所有数据的获取

红外图像实际上是彩色图像的一种特殊格式 —— kinectSensor.ColorStream.Enable(ColorImageFormat.InfraredResolution640x480Fps30)

显示图像语句 this.ColorImage.Source = BitmapSource.Create(imageFrame.Width, imageFrame.Height ,96,96, PixelFormats.Gray16 ,null , pixelData, imageFrame.Width * imageFrame.BytesPerPixel);


深度数据的处理

kinect 通过处理深度数据来识别传感器组前的两个人体图像,创建分段图 —— 一张位图,其像素与视野内距离摄像头最近的玩家索引对应(玩家索引为0,表示相应位置没有找到玩家,索引值为1,2表示检测到的玩家编号)

尽管玩家分段数据是隔离的逻辑流,但实际深度数据和玩家分段数据被合并到了一个独立的结构中

每个像素的高13位表示在深度传感器的视野范围内离特定坐标物体最近的距离,理论上该值的范围为0~8192毫米

每个像素的低3位标识在像素的xyz坐标系上追踪到的可见的玩家索引,这3位可看成整形值

深度图像数据类型定义为 DepthImageFrame   CopyPixelDataTo () 将从kinect设备获取到的深度图像数据赋值到short数组,该数组包含了每个像素的深度信息和玩家索引信息(16位)


骨骼追踪数据的处理方法

kinect 的核心技术,科准确标定人体的20个关键点,并能对这20个点的位置进行实时追踪

数据对象类型以骨骼帧的形式提供,每一帧最多可以保存20个点 ,每个骨骼点都是用Joint类型表示的

JointType :骨骼点的类型,枚举类型,列举了20个骨骼点的特定名称 —— JointType.HAND_LEFT

Position  : SkeletonPoint 类型表示骨骼点的位置信息 , SkeletonPoint 是一个结构体,包含x,y,z 三个数据元素,用以存储骨骼点的三维坐标

TrackingState : 枚举类型,表示骨骼点的追踪状态 (Tracked 表示正确捕捉到该骨骼点,NotTracked 表示没有捕捉到骨骼点,Inferred 状态不确定)

半身模式

Seated Mode —— 半身模式下,系统只捕捉上半身10个骨骼点的信息,忽略下半身(即使下半身骨骼点的数据不稳定或是不存在也不会对上半身的骨骼数据造成影响)

半身模式定义在枚举类型 SkeletonTrackingMode中 (default  seated)

应用程序获取下一帧骨骼数据的方式同获取彩色图像和深度图像数据的方式相同,都是通过调用回掉函数并传递一个缓存实现的 —— OpenSkeletonFrame

如果新的骨骼数据已经准备好,系统会将其复制到缓存中

轮询模式读取骨骼事件 ,通过调用SkeletonStream 类的OpenNextFrame 函数即可实现

public SkeletonFrame  OpenNextFrame (int millisecondswait)

当新的数据准备好或是超出等待时间时,OpenNextFrame() 函数才会返回

时间模式以事件驱动方式获取事件,更灵活,准确

应用程序传递一个事件处理函数给 SkeletonFrameReady事件,该事件定义在KinectSensor 类中,当下一帧的骨骼数据准备好时,会立即调用该事件回掉函数

RGB图像数据与深度图像数据(骨骼数据)的空间坐标系不同 —— 前者RGB摄像头,后者红外摄像头 ,因此使用获取的骨骼点坐标直接绘制在RGB图像上会有相应的误差

坐标系转换 kinectSensor.CoordinateMapper.MapSkeletonPointToColorPoint()

骨骼点的旋转信息(相对旋转信息和绝对旋转信息)—— 旋转的矩阵参数和四元数参数

骨骼点旋转信息定义为 BoneOrientation 类:

StartJoint  起始骨骼点

EndJoint  结束骨骼点

HierarchicalRotation  相对旋转信息

AbsoluteRotation  绝对旋转信息

BoneRotation  hierarchical = orientation.HierarchicalRotation;

BoneRotation  absolute=orientation.AbsoluteRotation;     BoneRotation 类型的记录了旋转信息的矩阵和四元数


音频API 的使用 —— 四元麦克风阵列

语音识别的任务就是使用计算机程序将语音转换成一串词语

kinect for windows sdk 为托管的应用程序结合 Microsoft Speech API 使用Kinect麦克组提供了必备的基础架构,支持最新的语音算法

AngleConference 属性表示音频源位置估计的置信度

监视束波方向的变化 ,当 KinectAudioSource的BeamAngle 属性发生变化时会出发BeamChanged事件

SpeechRecognitionEngine 类提供了一系列获取和管理语音识别引擎的方法(加载语法器,开始执行语音识别,结束语音识别)

InstalledRecognizers 是静态方法,返回一个语音识别器的列表 —— 包括了当前系统上安装的所有语音识别器

Speech 引擎会触发以下3个事件:

SpeechRecognitionEngine.LoadGrammer 事件会在每次尝试命令时发生,它会传递给事件处理函数一个SpeechRecognizedEventArgs对象,该对象包含一个从命令集合中选出的最佳匹配单词和一个估计的置信值

SpeechRecognitionEngine.SpeechRecognized 事件会在尝试的命令被识别为命令集合中的成员时发生,该事件会传递给事件处理函数一个包含识别出的命令的 SpeechRecognizedEventArgs 对象

SpeechRecognitionEngine.SpeechRejected 事件会在尝试的命令未被识别为命令集合成员时发生。它会传递给事件处理函数一个SpeechRecognitionRejectedEventArgs 对象

提高识别精确度:

增加识别字符串的单词数量

设计一个手势,只有Kinect 捕捉到这一特定的手势时才开启语音识别,否则保持关闭


Face Tracking SDK

可以识别出的人脸数据:

特征点坐标 (根据Kinect提供的深度图和彩色图,对人脸100个特征点进行识别和追踪)

面部朝向

包围盒

基于 Candide3 人脸模型的参数

Kinect 人机交互开发实践的更多相关文章

  1. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  2. Android游戏开发实践(1)之NDK与JNI开发03

    Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...

  3. TFS 2015 敏捷开发实践 – 在Kanban上运行一个Sprint

    前言:在 上一篇 TFS2015敏捷开发实践 中,我们给大家介绍了TFS2015中看板的基本使用和功能,这一篇中我们来看一个具体的场景,如何使用看板来运行一个sprint.Sprint是Scrum对迭 ...

  4. Android游戏开发实践(1)之NDK与JNI开发01

    Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...

  5. Android游戏开发实践(1)之NDK与JNI开发02

    Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...

  6. vue 2.0 开发实践总结之疑难篇

    续上一篇文章:vue2.0 开发实践总结之入门篇 ,如果没有看过的可以移步看一下. 本篇文章目录如下: 1.  vue 组件的说明和使用 2.  vuex在实际开发中的使用 3.  开发实践总结 1. ...

  7. Redis的Python实践,以及四中常用应用场景详解——学习董伟明老师的《Python Web开发实践》

    首先,简单介绍:Redis是一个基于内存的键值对存储系统,常用作数据库.缓存和消息代理. 支持:字符串,字典,列表,集合,有序集合,位图(bitmaps),地理位置,HyperLogLog等多种数据结 ...

  8. MVC5 网站开发实践 2.2、管理员身份验证

    上次完成了管理员的登录,这次要解决对管理员登录后的验证,采用AuthorizeAttribute属性的方式.之前还要解决几个问题,然后才重写验证类,最后稍微改一下界面. 目录 MVC5 网站开发实践  ...

  9. MVC5 网站开发实践 2.1、管理员登陆

    目录 MVC5 网站开发实践  概述 MVC5 网站开发实践  1.建立项目 MVC5 网站开发实践  2.后台管理   1. 创建SHA256加密方法. 在Data项目中添加文件夹[Security ...

随机推荐

  1. Timer 的 schedule()方法

    1.timer.schedule(new MyTask(),long time1,long time2); 第一个参数是TimerTask类,使用者要继承该类,并实现run()方法,因为TimerTa ...

  2. 安装Windows服务方法

    用sc create 服务名 binPath="路径",不要用老方法InstallUtil会出现一堆的错误

  3. 利用canvas制作简单的logo

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  4. CDR X6设计师的福利,3折特惠!

    最新消息称,即日起CorelDRAW官方为回馈新老用户长期以来的支持,特别推出CorelDRAW X6降价活动.目前CorelDRAW X6售价仅为2399元,照这个价格,CDR 2017     会 ...

  5. BZOJ 2555 SubString(LCT+后缀树)

    喜闻乐见的LCT+SAM 此题要求动态插入,直接上后缀树.然后询问其实就是求一个节点的子树后缀结束节点的个数. 因为建立后缀树需要插入和删除,就直接上LCT.每次加入一个点,把它到根的路径加一 (现在 ...

  6. BZOJ 4033[HAOI2015] 树上染色(树形DP)

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 3188  Solved: 1366[Submit][Stat ...

  7. python登录注册改良版

    #在执行本脚本的时候,需要先注册,否则会报字符串不匹配sum=3while True: #如果条件为真,则一直循环 print("先注册,在登录") print("1.注 ...

  8. 浅谈 MySQL的外键的作用

    MySQL中外键的介绍: MySQL外键必须使用存储引擎为  innDB  其中MySAM 和MEMORYH这两种引擎不支持 由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的 ...

  9. java 实现顺序结构线性列表

    package com.ncu.list; /** * * 顺序结构线性列表 * * @author liuhao * */ public class SquenceList<T> { p ...

  10. ASP.NET-让html代码输出为字符串

    HttpUtility.HtmlEncode这个函数可以让s变成没有攻击的代码,可以提升网站的安全性 public string Index(string s = "suepr name i ...