标签:kinect 深度图 结构光 prime sense 骨骼跟踪
“You are the Controller”,Kinect for Xbox的广告词,明确说明了Kinect体感的交互方式。作为一款集成了诸多先进视觉技术的自然交互设备,Kinect在学术和游戏业界均享有很高的关注度。此外,Kinect硬件的研发与生产综合了声、光、电和机械学等多方面的技术,其主要零部件近百个,是目前市场上大批量生产中的最为复杂的电子消费产品。
Kinect 的关键技术有四点:骨骼跟踪、动作识别、人脸识别、语音识别。本文关注的是基于前两者,骨骼跟踪和动作识别,这是Kinect 1体感交互的主要模块。Kinect 体感交互的流程大致是:
1、红外激光投影机周期性发射光编码形成散斑空间;
2、红外摄像头采集反射的散斑图像;
3、散斑图像分别与参考散斑图案进行互相关运算,得到各个像素点的互相关峰值,这个峰值就是深度图像;
4、深度图像经USB传送到主机;
5、通过人体分类器在深度图像中找到可能的人体区域,并创建分割掩膜,分割出人体区域;
6、通过机器学习的结果,快速对玩家的身体部位(头部、肢体、躯干等)进行分类;
7、从人体部位识别出20个关节点的三维坐标,从而进行人体骨骼三维建模;
8、基于骨骼跟踪进行动作识别(广义上识别的内容包含肢体运动、手势以及静态姿势),需要预先设定一些合理的动作定义;
9、游戏系统按照预定的动作定义,执行命令。
Kinect for XBox
Kinect1的视觉部分有三只“眼镜”,从左到右分别是红外激光投影机、彩色摄像头、红外摄像头。红外激光投影机投射红外激光,红外摄像头采集探测范围内反射回来的的红外光,依靠一定算法确定各反射点的距离,红外激光投影机和红外摄像头一起构成深度检测设备,为后续进一步的骨架提取提供基础。红外摄像头的深度图数据为320x240@30fps,每一个像素用16比特记录。深度检测设备的有效视角垂直方向43°,水平方向57°,有效视距0.8-3.5米,单人的最佳视距为2.26米,双人的最佳视距为2.5米。彩色摄像头主要用来做人脸识别等应用,红外摄像头对光照无要求,即使在黑夜里也能操作。但是彩色摄像头需要明亮的光照,否则人脸识别等功能无法完成。彩色摄像头的分辨率为640x480@30fps,没像素32比特。Kinect配备了自动追焦系统,如果追踪的玩家超出了有效视角范围,底座马达可驱动Kinect左右旋转27度。
为了让深度图像和彩色图像相互对应,必须进行“Prime Sense注册过程”。注册就是将彩色图像和深度图像进行对应,产生像素相互对应的影像,即彩色图像中的每个像素分别与深度图像中的一个像素对应。这能让应用程序准确了解收到的彩色图像中每个像素的深度。
Kinect1红外激光投影机投射的不是普通的红外光线,而是Prime Sense公司为微软提供的光编码(Light Coding)技术,这项技术属于结构光三维测量技术的一种。可能当时Prime Sense的开价比较贵,微软买入了另外两家利用TOF技术做三维测量的公司,而没有买Prime Sense,只是采用了Prime Sense的技术,Kinect1的核心运算单元就是Prime Sense的PS1080芯片(PS1080负责处理红外图像,然后逐帧生成准确的场景深度图像)。Light Coding使用的是连续的照明(而非脉冲),也不需要特制的感光芯片,只需要普通的CMOS感光芯片,这让方案的成本大大降低,对Kinect消费及电子产品的市场化至关重要。
Light Coding,是用光源照明给需要测量的空间编码,属于结构光技术。但与传统的结构光方法不同的是,它的光源投射的是一个具有三维纵深的“体编码”。这种光源叫做激光散斑(Laser Speckle),是当激光照射到粗糙物体或穿透毛玻璃后形成的随机衍射斑点。这些散斑具有高度的随机性,而且随着距离的不同散斑图案不同,也就是说空间中任意两处的散斑图案都是不同的。只要在空间中打上这样的结构光,整个空间就都被做了标记,把一个物体放进这个空间,只要看看物体上面的散斑图案,就可以知道这个物体在什么位置。当然,在这之前要把整个空间的散斑图案都记录下来,所以要先做一次光源标定。
Kinect1散斑图案
(在黑暗的环境里,用夜视摄像机拍摄Kinect1的检测区域)
在Prime Sense的专利上,标定的方法是这样的:每隔较短的一段距离,取一个参考平面,并把参考平面上的散斑图案记录下来。假设Kinect规定的用户距离是1~4米,每隔1cm取一个参考平面并把这个平面上的散斑图案记录下来,那么标定完成后就保存了300幅散斑图像。测量的时候,拍摄一幅待测量的散斑图像,将这幅图像和保存下来的300幅参考图案依次做互相关运算,进而得到300幅相关度图像。空间中有物体存在的位置,在相关度图像上就会显示出峰值。把这些峰值叠在一起,再经过一些插值,就会得到整个场景的三维形状了。可以看到Light Coding技术不是通过空间几何关系求解的,它的测量精度只和标定时取的参考面的距离密度有关,参考面越密测量将越精确。根据第三方的测试数据,Kinect对于在2米左右的物体,X、Y轴上的空间精度是3毫米,Z轴(前后)上的空间精度为1厘米。
深度图像的分辨率320x240,帧率为30fps。帧率是由Prime Sense的PS1080芯片处理能力限制的,对于一般性的运动游戏,30fps可以应付,对于电影级别的运动采集,30fps满足不了要求。深度图像的每个像素点表示该像素与红外摄像头之间的距离,用16比特来表示,其中低3位是用户ID,“000”表示该像素属于背景,“001”表示该像素属于玩家1,“010”表示该像素属于玩家2,以此类推。理论上除了000外,Kinect1可以标定7个人,但Kinect1输出最多6个人的深度信息。深度像素高13位是距离信息,黑色表示极远,白色表示极近。16比特全为0表示该像素深度信息不可获得(要么是极远,要么是极近)。
Kinect是通过人体分类器来分类类似人体的目标,因此类似人体的目标都有可能被识别为人体。例如挂在衣架上的衬衣,一个大的毛绒玩具熊等。Kinect的骨骼识别可以兼容不同身高的人体,从幼儿到成人都基本可以准确识别;除了站姿之外,还可以分辨出坐姿的人体。因为Kinect的分类器是基于人体来训练的,因此它不能识别其他非人体的动植物。Kinect不能识别人的正面和背面。透明物体,发光物体(台灯尤其是卤素灯、电脑屏幕等),镜子等反光物体,某些黑色物体,对Kinect的识别有影响。肤色、背景光照对骨架识别没有影响,但对彩色摄像机的工作有影响,例如黑人的人脸识别。对于被遮盖或重叠的人体部位,通过相邻的关节点以及机器学习的结果,Kinect可以推测出人体部位。
Kinect是先识别人体部位进而再推断出关节点,这是一个近似度概率匹配、评估的过程。在Kinect里面,人体骨骼是通过20个关节点来表示的。每一个关节由(x, y, z)三维坐标点来标注它在骨架空间中的位置。(从这点来看,不是深度摄像头的精度不够,而是微软就没有想要去检测手指的动作,因为整个手部是一个关节点坐标。类似的还有表情识别)。虽然理论上Kinect可以提供最大7个人的深度信息,但处于性能与实际情况的考虑,Kinect最多只跟踪两个骨骼,最多可以检测六个人。也就是说,假如Kinect面前站着六个人,Kinect能告诉你这六个人具体站在什么位置,但只能提供其中两个人的关节点数据。
Kinect 人体关节
动作识别包含静态姿势和动态动作。姿势是骨骼在某一时间点的状态,例如Kinect中玩家左手向下倾斜45度,表示“暂停或退出”命令。动作是骨骼中的某一关节或是多个关节点在空间的运动序列,是为动态的行为。比如挥动左手,或者离地跳起等。动态的行为分析要比静态的姿势识别要复杂得多。
参考:余涛. 《Kinect应用开发实战:用最自然的方式与机器对话》 机械工业出版社. 2012年11月.
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:kinect 深度图 结构光 prime sense 骨骼跟踪
原文地址:http://blog.csdn.net/huibailingyu/article/details/46912237