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. JVM的重排序

    重排序一般是编译器或执行时环境为了优化程序性能而採取的对指令进行又一次排序执行的一种手段.重排序分为两类:编译期重排序和执行期重排序,分别相应编译时和执行时环境. 在并发程序中,程序猿会特别关注不同进 ...

  2. c# 获取文件夹下面所有文件夹列表

    方法一: string dirPath = @"D:\App1"; List<string> dirs = new List<string>(Directo ...

  3. m_Orchestrate learning system---十一、thinkphp查看临时文件的好处是什么

    m_Orchestrate learning system---十一.thinkphp查看临时文件的好处是什么 一.总结 一句话总结:可以知道thinkphp的标签被smarty引擎翻译而来的php代 ...

  4. javascript系列-class2.javascript 基本使用

    欢迎加入前端交流群来py: 转载请标明出处!     逻辑运算             一门计算机语言,编程的核心在于逻辑思想,当我们在编写程序的时候,逻辑是否通顺,是能否正确写出程序的关键,可以说如 ...

  5. vue 组件之间的传值

    父向子传值父组件 <v-footer :projectdat="dat"></v-footer> export default { data() { ret ...

  6. c# iTextSharp导出PDF

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Th ...

  7. 你不知道的JavaScript(九)switch语句

    在c/c++.java这些强类型的语言中switch语句的表达式和case分支中的条件值都只能是char类型或整数.JS的switch语句有些不同,它可以是JS中的任意一种类型,这一点有些朋友可能并没 ...

  8. hiho1605 - 递推+1000000000=矩阵快速幂

    题目链接 题目大意 小Hi最近对生成树(包含所有顶点的联通无环子图.)非常的感兴趣,他想知道对于特定的简单平面无向图是不是存在求生成树个数的简单方法. 小Hi定义了这样的图:一个以{0,1,2……n} ...

  9. php如何实现文件下载

    php如何实现文件下载 1. 设置超链接的href属性 <ahref="文件地址"></a> 如果浏览器不能解析该文件,浏览器会自动下载.而如果文件是图片或 ...

  10. 3ds Max制作一面飘扬的旗帜效果图

    在大家平时建模过程中肯定会遇到很多力学作用的模型,它们有很多的不确定性,通过人工拖拽的手段很难达到理想的自然效果,这时我们就需要一些特殊的命令来完成我们模拟自然状态的效果.下面我们就一面飘扬的国旗来探 ...