kinect彩色图和深度图对齐(一)

本文主要记录kinect相关的知识和对齐方法,这是第一部分,此记。

深度相机成像方法简介

深度相机就是可以获取场景中物体距离摄像头物理距离的相机。深度相机通常由多种镜头和光学传感器组成,根据测量原理不同,主流的深度相机一般分为以下几种方法:飞行时间法(ToF)、结构光法、双目立体视觉法。

飞行时间是从Time of Flight直译过来的,简称TOF。其测距原理是通过连续发射经过调制的特定频率的光脉冲(一般为不可见光)到被观测物体上,然后接收从物体反射回去的光脉冲,通过探测光脉冲的飞行(往返)时间来计算被测物体离相机的距离。微软的Kinect V2采用的就是ToF方案。

结构光法就是使用提前设计好的具有特殊结构的图案(比如离散光斑、条纹光、编码结构光等),将图案投影到三维空间物体表面上,使用另外一个相机观察在三维物理表面成像的畸变情况。如果结构光图案投影在该物体表面是一个平面,那么观察到的成像中结构光的图案就和投影的图案类似,没有变形,只是根据距离远近产生一定的尺度变化。但是,如果物体表面不是平面,那么观察到的结构光图案就会因为物体表面不同的几何形状而产生不同的扭曲变形,而且根据距离的不同而不同,根据已知的结构光图案及观察到的变形,就能根据算法计算被测物的三维形状及深度信息。微软的Kinect V1采用的就是基于结构光的光编码方案。

结构光法优缺点总结

根据前面的原理介绍,我们总结一下基于结构光法深度相机的优缺点。

优点

1)、由于结构光主动投射编码光,因而非常适合在光照不足(甚至无光)、缺乏纹理的场景使用。

2)、结构光投影图案一般经过精心设计,所以在一定范围内可以达到较高的测量精度。

3)、技术成熟,深度图像可以做到相对较高的分辨率。

缺点

1)、室外环境基本不能使用。这是因为在室外容易受到强自然光影响,导致投射的编码光被淹没。增加投射光源的功率可以一定程度上缓解该问题,但是效果并不能让人满意。

2)、测量距离较近。物体距离相机越远,物体上的投影图案越大,精度也越差(想象一下手电筒照射远处的情景),相对应的测量精度也越差。所以基于结构光的深度相机测量精度随着距离的增大而大幅降低。因而,往往在近距离场景中应用较多。

3)、容易受到光滑平面反光的影响。

双目立体视觉法的原理和人眼类似,通过计算空间中同一个物体在两个相机成像的视差就可以根据如下三角关系计算得到物体离相机的距离。

Kinect简介

Kinect有三个镜头,中间的镜头是RGB彩色摄影机,用来采集彩色图像。左右两边镜头则分别为红外线发射器和红外线CMOS摄影机所构成的3D结构光深度感应器,用来采集深度数据(场景中物体到摄像头的距离),Kinect采用了“光编码”的方式,读取投射的红外线光谱,通过反射斑点(称为散斑)的变形来取得纵向的深度的信息。彩色摄像头最大支持1280×960分辨率成像,红外摄像头最大支持640×480成像,最高输出速度为30fps。Kinect还搭配了追焦技术,底座马达会随着对焦物体移动跟着转动。Kinect也内建阵列式麦克风,由四个麦克风同时收音,比对后消除杂音,并通过其采集声音进行语音识别和声源定位。

Kinect V1的Kinect V2的对比

Kinect v1深度相机拥有一个RGB彩色摄像头,一个红外线CMOS摄像机和一个红外发射器。相机的红外线CMOS摄像机和红外发射器以左右水平的方式分布。该相机采用的是以结构光为基础进行改进后的光编码(Light Coding)技术获得物体的深度信息。

Kinect V2采用的是「Time of Flight(TOF)」的方式,通过从投射的红外线反射后返回的时间来取得Depth信息。Depth传感器看不到外观,不过Color Camera旁边是红外线Camera(左)和投射脉冲变调红外线的Porjector(右)。

Kinect 驱动简介:非官方和官方开发包的优缺点

官方SDK:

长处:

提供了音频支持、调整倾角的转动电机、在全身跟踪骨骼跟踪方面:非标准姿势检測(相对于OpenNi的投降姿势…),头部、手、脚、锁骨检測以及关节遮挡等细节上的处理更为仔细(但精度是否更高还不能确定)。此外,支持多传感器(多台Kinect);

缺点:

微软对非商业使用的限制。此外,未提供手势识别和跟踪功能,未实现RGB图像/深度图像的互对齐,仅仅是提供了对个体坐标系的对齐。在全身骨骼跟踪中,SDK仅仅计算了关节的位置,并未得出其旋转角度。从可移植的角度来看,SDK beta仅仅能用于Kinect/Win7平台,而OpenNi还至少支持华硕的WAVI Xtion体感设备,今后支持的硬件平台还可能很多其它。相比較而言SDK beta不支持Unity3D游戏引擎、不支持记录/回放数据写入磁盘、不支持原始红外视频数据流、也不支持像OpenNi一样的角色入场和出场的事件响应机制。

非官方OpenNI/NITE:

长处:

可用于商业开发、包括手势识别和跟踪功能、可自己主动对齐深度图像和RGB图像,全身跟踪、关节旋转角度计算、看起来性能较好、已有众多游戏产品应用、支持记录/回放数据写入磁盘、支持原始红外视频数据流、支持角色入场和出场的事件响应机制。支持Primesense和华硕的WAVI Xtion硬件平台和windows、Linux和Mac等软件平台。自带的代码全面支持Unity3D游戏引擎。

缺点:

未提供音频功能、不支持调整倾角的转动电机、在全身跟踪骨骼跟踪方面:无法跟踪头部、手、脚和锁骨的旋转动作,须要标准姿势检測(即著名的投降姿势…),关节遮挡等细节上的处理似乎存在算法bug。不能自己主动安装并识别Kinect多机环境。安装过程较为繁琐,特别是NITE还要申请开发证书编码。OpenNi也没有提供可用视频和深度图输入的事件触发机制(但OpenNI提供了类似功能的函数可使用,尽管不是回调函数,可是也非常好用)。

总结:

OpenNI最大的优势就是同意跨平台多设备,以及商业应用。但从原始数据的採集和预处理技术上看,微软的SDK似乎更稳定一些,况且还提供了不错的骨骼和语音支持。对于部分身体部位识别方面的功能,SDKbeta没有提供局部识别和跟踪,这须要自己的兴许开发(至少在相当一段时期内微软可能都不会提供此类功能)。OpenNi/NITE尽管提供了手势识别和跟踪,然而在全身骨骼姿势识别和跟踪上还要很多其它借鉴微软的产品。

因此,依照眼下在社区中的表现,SDK beta和OpenNi/NITE孰优孰劣还真无法一下子确定。并且随着越来越多的开发人员增加微软这一方,SDK beta的普及可能会更快,但在更高层次的应用上,对二者的选用往往是须要一定智慧的。

Kinect驱动安装

刚开始使用kinect首先需要安装kinect驱动,我的机器环境是:Ubuntu16.04 kinect V1, 驱动分别是:openni/NITE/Sensor这三个包的版本必须匹配才能正常运行,版本号分别是:

OpenNI-Bin-Dev-Linux-x64-v1.5.7.10.tar

NITE-Bin-Linux-x64-v1.5.2.23.tar

SensorKinect093-Bin-Linux-x64-v5.1.2.1

可以在网盘下载,链接: 驱动下载 提取码: 7ckj。

【Tips】

这三个软件包的安装要注意顺序:先安装openni,再安装Sensor,最后安装NITE。

安装方法

1,OpenNI

1
2
$cd /Home/Downloads/OpenNI-Bin-Dev-Linux-x64-v1.5.7.10
$sudo ./install.sh

安装完成后会有成功提示:

1
2
3
4
5
6
copying
shared libraries...OK
....
....
***
DONE ***

2,SensorKinect和NITI

安装方法相似,

1
2
$ cd /Home/Downloads/Sensor-Bin-Linux-x64-v5.1.2.1
$ sudo ./install.sh

1
2
3
$ cd /Home/Downloads/NITE-Bin-Linux-x64-v1.5.2.23
$ sudo ./install.sh
`

安装完成后同样会有DONE ×××类似的成功提示。

测试方法

测试安装成功与否的方法是采用OpenNI自带的例程

1
2
$ cd /Home/Downloads/OpenNI-Bin-Dev-Linux-x64-v1.5.7.10/Samples/Bin/x64-Release
$ ./NiViewer

如果出现以下kinect画面则配置成功。

另外可以带-u参数卸载这些软件包重新安装

1
$sudo ./install.sh -u

但是NITE里有专门的uninstall.sh可以运行它来卸载。

ROS环境下的测试

如果你安装了ROS,那么还可以通过安装freenect功能包来测试kinect

1
2
3
4
5
6
$ cd ~/catkin_ws/src
$ git clone https://github.com/ros-drivers/freenect_stack.git
$ cd ~/catkin_ws/
$ catkin_make
$ rospack profile
$ roslaunch freenect_launch freenect.launch

如果我的文章对你有所帮助,那么不妨?