Kinect 学习j记录——one
Kinect(Light Coding)就是以红外线发出人眼看不见的class1雷射光,透过镜头前的diffuser(光栅、扩散片)将雷射光均匀分布投射在测量空间中,再透过红外线摄影机记录下空间中的每个散斑,撷取原始资料后,再透过晶片计算成具有3D深度的图像。
工具:SDK+OpenCV+VS2017
kinect 2.0开发第一步,研究kinect2.0 API。
本文主要是翻译官方文档,另外加入自己的一点理解和实验
文档网址: https://msdn.microsoft.com/en-us/library/dn782033.aspx
1.API分类
主要分为三类
1)Windows系统运行API(Windows Runtime APIs )。
2).NET API
3)原始API(native APIs)
Kinect v1,可以读取投射的红外线pattern,从pattern的变形获取Depth的信息,搭载了「Light Coding」方式的Depth传感器。Kinect v2预览版,通过从投射的红外线脉冲反射回来的时间来获得Depth的信息,变更为「Time of Flight(ToF)」方式的Depth传感器。
Light Coding,顾名思义,就是用光源照明给需要测量的空间编上码,属于结构光技术的一种,只是深度计算方式不一样。结构光(Structured Lighting)是将一维或二维的图像投影至被测物上,根据图像的形变情形,判断被测物的表面形状,可以非常快的速度进行扫描,相对于一次测量一点的探头,此种方法可以一次测量多点或大片区域,故能用于动态测量。
与普通结构光法不同的是,Light Coding的光源称为“激光散斑”,是激光照射到粗糙物体或穿透毛玻璃后随机形成的衍射斑点。这些散斑具有高度的随机性,而且会随着距离的不同而变换图案。也就是说空间中任意两处的散斑图案都是不同的。只要在空间中打上这样的结构光,整个空间就都被做了标记,把一个物体放进这个空间,只要看看物体上面的散斑图案,就可以知道这个物体在什么位置了。当然,在这之前要把整个空间的散斑图案都记录下来,所以要先做一次光源标定。
Time of Flight是一种主动式深度感应技术,其使用激光探测目标物。顾名思义,Time of Flight就是去计算光线飞行的时间。首先让装置发出脉冲光,并且在发射处接收目标物的反射光,藉由测量时间差算出目标物的距离;ZCam就是使用 TOF技术,使用红外线以及Accelerometers加速度计感应器,感测立体空间的相对位置变化,建构灰阶距离影像的深度感应器。3DV Systems公司研发该技术已经长达10年,并取得许多专利技术,微软二代Kinect使用TOF也是情理之内的事。
除此以外,新一代Kinect还有许多新特点:彩色摄像头达到了FullHD(1920 x 1080 @30fps);更大的视角,FOV 由 53×47 度变為 70×60 度;在 1 米左右距离即可侦测使用者;可以侦测6 位使用者(含骨架)、25 个关节点(关节点与上一代相比多5个,现在在手掌这部分现在有三个关节点,所以可以在一定程度上侦测手的开合状态);可以根据脸部彩色影像的细微变化侦测心跳。
第二代Kinect已经发售,其性能发生了翻天覆地的进化。其中最大的改变是改为采用TOF技术,号称有三倍的精确度。其数据的稳定性相對较好、细节更多;被其他环境光源(红外线)影响的概率也更低,甚至可以承受一定程度的日光。也由于深度感应改采用TOF技术,所以捕捉到的红外线影像不會像 PrimeSense 的技术有散斑、画面很干净。
读取深度图像步骤
- 获取kinect传感器
- 打开传感器
- 获取深度信息传感器
- 打开深度帧读取器
- 获得最近的一帧
- 将深度信息转换为MAT格式
- 用opencv的imshow显示
- 回收和释放内存
读取彩色图像步骤
1.获取kinect传感器
2.打开传感器
3.获取彩色图像信息传感器
4. 打开彩色图像帧读取器
5.获得最近的一帧
6. 将彩色图像转换按三通道保存为MAT格式
7.用opencv的imshow显示
8. 回收和释放内存