Kinect 人机交互开发实践
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 人机交互开发实践的更多相关文章
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- Android游戏开发实践(1)之NDK与JNI开发03
Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...
- TFS 2015 敏捷开发实践 – 在Kanban上运行一个Sprint
前言:在 上一篇 TFS2015敏捷开发实践 中,我们给大家介绍了TFS2015中看板的基本使用和功能,这一篇中我们来看一个具体的场景,如何使用看板来运行一个sprint.Sprint是Scrum对迭 ...
- Android游戏开发实践(1)之NDK与JNI开发01
Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...
- Android游戏开发实践(1)之NDK与JNI开发02
Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...
- vue 2.0 开发实践总结之疑难篇
续上一篇文章:vue2.0 开发实践总结之入门篇 ,如果没有看过的可以移步看一下. 本篇文章目录如下: 1. vue 组件的说明和使用 2. vuex在实际开发中的使用 3. 开发实践总结 1. ...
- Redis的Python实践,以及四中常用应用场景详解——学习董伟明老师的《Python Web开发实践》
首先,简单介绍:Redis是一个基于内存的键值对存储系统,常用作数据库.缓存和消息代理. 支持:字符串,字典,列表,集合,有序集合,位图(bitmaps),地理位置,HyperLogLog等多种数据结 ...
- MVC5 网站开发实践 2.2、管理员身份验证
上次完成了管理员的登录,这次要解决对管理员登录后的验证,采用AuthorizeAttribute属性的方式.之前还要解决几个问题,然后才重写验证类,最后稍微改一下界面. 目录 MVC5 网站开发实践 ...
- MVC5 网站开发实践 2.1、管理员登陆
目录 MVC5 网站开发实践 概述 MVC5 网站开发实践 1.建立项目 MVC5 网站开发实践 2.后台管理 1. 创建SHA256加密方法. 在Data项目中添加文件夹[Security ...
随机推荐
- nyist oj 138 找球号(二)(hash 表+位运算)
找球号(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描写叙述 在某一国度里流行着一种游戏.游戏规则为:现有一堆球中.每一个球上都有一个整数编号i(0<=i< ...
- Educational Codeforces Round 6 C. Pearls in a Row set
C. Pearls in a Row There are n pearls in a row. Let's enumerate them with integers from 1 to n from ...
- Win10使用VMware虚拟机安装ubuntu
Win10专业版自带有虚拟机安装工具Hyper-V,也可以使用其他如VMware工具安装,也挺方便. 所需工具: 1. VMware-workstation 下载链接: http://rj.bai ...
- [JZOJ 5875] [NOIP2018提高组模拟9.20] 听我说,海蜗牛 解题报告(BFS+二分)
题目链接: http://172.16.0.132/senior/#main/show/5875 题目: 题解: 注意这题只能经过开放的港口 我们考虑用vector存下每个点不能到的点,并把并让vec ...
- autocomplete="off" 不起作用解决方案
autocomplete属性是表单字段中的HTML5新属性,该属性有两种状态值,分别为"on" 和 "off",该属性可省略:省略属性值后默认值为"o ...
- Spark SQL概念学习系列之Spark SQL概述
很多人一个误区,Spark SQL重点不是在SQL啊,而是在结构化数据处理! Spark SQL结构化数据处理 概要: 01 Spark SQL概述 02 Spark SQL基本原理 03 Spark ...
- (转载)10个实用的但偏执的Java编程技术
10个实用的但偏执的Java编程技术 在沉浸于编码一段时间以后(比如说我已经投入近20年左右的时间在程序上了),你会渐渐对这些东西习以为常.因为,你知道的…… 作者:小峰来源:码农网|2015-09- ...
- 模拟post提交
模拟post提交 function post(URL, PARAMS) { var temp = document.createElement("form"); temp.acti ...
- S-T表学习笔记
$O(nlogn)$构造$O(1)$查询真是太强辣 然而不支持修改= = ShØut! #include<iostream> #include<cstring> #includ ...
- BZOJ 3689 异或之 (可持久化01Trie+堆)
题目大意:给你一个序列,求出第$K$大的两两异或值 先建出来可持久化$01Trie$ 用一个$set$/堆存结构体,存某个异或对$<i,j>$的第二关键字$j$,以及$ai\;xor\;a ...