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 人脸模型的参数