技术比较
Kinect v1的深度传感器采用了一种称为“光编码”(Light Coding)的技术(源自以色列的PrimeSense Inc.的技术,该公司2013年被苹果收购)。该方法读取投影的红外图案(Pattern),并从图案的变形中获取深度信息。因此,深度传感器分为投射红外图案的IR投影仪(左)和读取红外图案的IR相机(右)。此外,在深度传感器中间安装彩色摄像机。
Kinect v2的深度传感器采用称为“飞行时间”(Time of Flight, ToF)的方法(貌似来自微软收购的一家公司(3DV Systems,Canesta)),该方法从反射和返回反射红外线的时间获得深度信息。从外部看不到的深度传感器配备了红外摄像头(左侧)和投射脉冲调制红外线的投影机(右侧)。彩色摄像头在旁边一侧。
下图简单展示了“光编码”方法与“飞行时间”方法之间的区别:
Kinect v1
红外激光(infrared laser)发射一束光柱,然后通过衍射光栅机制分成多份光束,投影到物体的光斑被红外照相机(infrared camera)捕捉,并与已知的参考光斑比较,投影光斑和观察到的光斑用来计算深度信息。
规格比较
Items | Kinect v1 | Kinect v2 |
---|---|---|
彩色图(Color) | 640x480@30fps | 1920x1080@30fps |
深度图(Depth) | 320x240@30fps | 512x424@30fps |
范围(Range) | 0.8~4.0m | 0.5~4.5m |
传感器远离(Sensor) | 结构光(Structured Light) | 飞行时间(Time of Flight) |
视场(Angle of View) 水平/垂直 |
57/43 | 70/60 |
麦克风阵列(Microphone Array) | O | O |
人体(Body) | 6 people | 6 people |
人体标记(BodyIndex) | 2 people | 6 people |
关节(Joint) | 20 joints/people | 25 joints/people |
Hand State | Open / Closed | Open / Closed / Lasso |
Gesture | X | O |
Face | O | O |
Speech/Beamforming | O | O |
彩色图
Kinect v1
- 640 x 480 x 24 bpp 4:3 RGB @ 30fps
- 640 x 480 x 16 bpp 4:3 YUV @ 15fps
Kinect v2
- 1920 x 1080 x 16 bpp 16:9 YUY2 @ 30 fps
注:bpp代表像素深度
Kinect v1的Color Camera的分辨率仅为640x480,Kinect v2的分辨率大幅提高,能够达到1920×1080。
注:v1的要求是USB2.0,理论传输速率是60MB/s,v2是USB3.0,理论传输速率是500MB/s。
可以计算一下,以XRGB Color为例,30fps,那么每秒所需传输的数据大小为640 x 480 x 4 x 30约为35M;再加上USHORT格式的Depth Color,30fps,大小为320 x 240 x 2 x 30约为4M。总计约为40MB/s,因为带宽有限,所以在保证画面帧率稳定的情况下,分辨率只能如此,而且基本上必须独占一个USB Controller。
再算算v2的情况,Color = 1920 x 1080 x 4 x 30 约为237M,Depth = 512 x 424 x 2 x 30约为12M,总计约为250M/s。所以非USB3.0不可,否则传输不了这么大的数据量。
显而易见,Color Map是最占带宽的,其实可以通过一些其他格式,比如I420或MJPG来减少数据量,然后通过CPU或GPU来进行解压和回放。
深度图
Kinect v2预览版的深度传感器的分辨率也提高到512×424,而Kinect v1是可以取640×480分辨率的深度数据,乍一看规格好像下降了,其实Kinect v1的深度传感器的物理分辨率是320x240,Up Scaling到640x480而已(注:猜测是Runtime处理的)。另外,深度传感器的方式也是从Light Coding变更为Time of Flight(TOF)。
Kinect v1
- 320 x 240 x 16 bpp, 13-bit depth, 3-bit玩家信息
Kinect v2
- 512 x 424 x 16 bpp, 13-bit depth, 3-bit玩家信息
Kinect v1的深度图有16位,其中13bit保存深度信息(包括一个标志位),另外3bit保存player information,如果player index没有被申请,则这3bit为0。
12bit的深度信息能够覆盖2^12=4096mm,也就是4米的距离。
标志位存储如下信息
- Too near: 0x0000
- Too far: 0x7ff8
- Unknown: 0xfff8
深度图像是12位的,存储格式是PNG。
- JPG只能存储8位,且属于有损压缩。
- PNG最大支持单通道16位,且PNG是一种无损压缩格式。
人体关节
Kinect v1中可用的关节每人有20个,但Kinect v2有25个关节,如图所示有增加了
- 颈部(NECK)
- 指尖(HAND_TIP_LEFT, HAND_TIP_RIGHT)
- 拇指(THUMB_LEFT, THUMB_RIGHT)
这五个位置。