Kinect SDK(1):读取彩色、深度、骨骼信息并用OpenCV显示

//****************Edit 02/08/2015*******************************

在KinectSDK2.0发布后,好多人反应找不到KinectSDK 1.8的下载页面,现将链接粘在此处 

KinectSDK-v1.8-Setup.exe      KinectDeveloperToolkit-v1.8-Setup.exe

Kinect MSDN Blog——关于Kinect最新官方新闻

http://blogs.msdn.com/b/kinectforwindows/

//******************************************************************


Kinect SDK 读取彩色、深度、骨骼信息并用OpenCV显示


一、原理说明

对于原理相信大家都明白大致的情况,因此,在此只说比较特别的部分。

1.1 深度流数据:

深度数据流所提供的图像帧中,每一个像素点代表的是在深度感应器的视野中,该特定的(x, y)坐标处物体到离摄像头平面最近的物体到该平面的距离,

注意是平面到平面距离,并不是到摄像机的斜线距离(以毫米为单位)。


Kinect中深度值最大为4096mm0值通常表示深度值不能确定,一般应该将0值过滤掉。微软建议在开发中使用1220mm~3810mm范围内的值。

在进行其他深度图像处理之前,应该使用阈值方法过滤深度数据至1220mm-3810mm这一范围内。

下图显示了Kinect Sensor的感知范围,其中的default rangeXbox 360Kinect for Windows都适用,而near range仅对后者适用:


深度数据的存储:

Kinect的深度图像数据含有两种格式,两种格式都是用两个字节来保存一个像素的深度值,而两方式的差别在于:

(1)唯一表示深度值:那么像素的低12位表示一个深度值,高4位未使用;

(2)既表示深度值又含有游戏者ID:Kinect SDK具有分析深度数据和探测人体或者游戏者轮廓的功能,它一次能够识别多达6个游戏者。SDK为每一个追踪到的游戏者编号作为索引。

而这个方式中,像素值的高13位保存了深度值,低三位保存用户序号,7 (0000 0111)这个位掩码能够帮助我们从深度数据中获取到游戏者索引值。对于这种情况的处理如下:

USHORTrealDepth = (depthID & 0xfff8) >> 3; //提取距离信息,高13位

USHORTplayer =  depthID & 0x07 ;  //提取ID信息,低3位

SDK提供了专门的函数:

SHORT realDepth= NuiDepthPixelToDepth(depth);
USHORT playerIndex         = NuiDepthPixelToPlayerIndex(depth);//获得深度图该点像素位置对应的 UserID;

在对OpenCV进行赋值时需要将其转化到[0,255]

BYTE b = 255 - static_cast<BYTE>(256 * realDepth / 0x0fff);


1.2 Skeleton信息


玩家的各关节点位置用(x, y, z)坐标表示。与深度图像空间坐标不同的是,这些坐标单位是米。坐标轴x,y, z是深度感应器实体的空间x, y, z坐标轴。这个坐标系是右手螺旋的,Kinect感应器处于原点上,z坐标轴则与Kinect感应的朝向一致。y轴正半轴向上延伸,x轴正半轴(从Kinect感应器的视角来看)向左延伸,如下图所示。

Kinect放置的位置会影响生成的图像。例如,Kinect可能被放置在非水平的表面上或者有可能在垂直方向上进行了旋转调整来优化视野范围。在这种情况下,y轴就往往不是相对地面垂直的,或者不与重力方向平行。最终得到的图像中,尽管人笔直地站立,在图像中也会显示出事倾斜的。

Kinect最多可以跟踪两个骨骼,可以最多检测六个人。站立模式可以跟踪20个关节点,坐姿模式的话,可以跟踪10个关节点。

       NUI骨骼跟踪分主动和被动两种模式,提供最多两副完整的骨骼跟踪数据。主动模式下需要调用相关帧读取函数获得用户骨骼数据,而被动模式下还支持额外最多四人的骨骼跟踪,但是在该模式下仅包含了用户的位置信息,不包括详细的骨骼数据。也就是说,假如Kinect面前站着六个人,Kinect能告诉你这六个人具体站在什么位置,但只能提供其中两个人的关节点的数据(这两个人属于主动模式),也就是他们的手啊,头啊等等的位置都能告诉你,而其他的人,Kinect只能提供位置信息,也就是你站在哪,Kinect告诉你,但是你的手啊,头啊等具体在什么位置,它就没法告诉你了(这四个人属于被动模式)。

对于所有获取的骨骼数据,其至少包含以下信息:

1)、相关骨骼的跟踪状态,被动模式时仅包括位置数据(用户所在位置),主动模式包括完整的骨骼数据(用户20个关节点的空间位置信息)。

2)、唯一的骨骼跟踪ID,用于分配给视野中的每个用户(和之前说的深度数据中的ID是一个东西,用以区分现在这个骨骼数据是哪个用户的)。

3)、用户质心位置,该值仅在被动模式下可用(就是标示用户所在位置的,当无法检测出Skeleton数据时,就应该显示用户质心位置,因为质心是根据深度图的UserID计算出来的,并不受骨骼信息影响)。






二、流程解析

作为一名KINECT程序员,你需要记得的是,微软SDK中提供的运行环境在处理KINECT传输数据时,是遵循一条3步骤的运行管线的。
第一阶段:只处理彩色和深度数据
第二阶段:处理用户索引并根据用户索引将颜色信息追加到深度图中。(参考 NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX)
第三阶段:处理骨骼追踪数据


1. 基本设置

1.1 在vs2010项目中,需要设置C++目录
包含目录中加入 $(KINECTSDK10_DIR)\inc;

库目录中加入    $(KINECTSDK10_DIR)\lib\x86

   (注意安装Kinect SDK以后,路径不一样了,环境变量名变成KINECTSDK10_DIR)

   MSRKINECTSDK是环境变量,正确安装MS KINECT FRO WINDOWS SDK 后,会在计算机中的环境变量中看到。
1.2 添加特定库
   除了指定目录外,你还需要在链接器中设置附加依赖项,填入KinectNUI.lib
1.3 头文件
    为了使用NUI中的API,首先我们要包含 NuiApi.h,切记,在这之前,要保证你已经包含了windows.h

   #include <Windows.h>

    #include "NuiApi.h"

   切记,在这之前,要保证你已经包含了windows.h否则 Nuiapi中很多根据windows平台定义的数据类型及宏都不生效。

1.4 其他设置

如果要使用Kinect SDK 1.7+中的Inteaction部分控件,除了以上提到的基本设置需要额外加入Kinect toolkit文件夹下的相应的.h、.lib以及dll文件。

PS:

其实最简单的方法就是把Kinect Toolkits中的类似sample Install到目录,一看就知道怎么做的了、


2. Nui初始化

接下来,任何想使用微软提供的API来操作KINECT,都必须在所有操作之前,调用NUI的初始化函数

HRESULT NuiInitialize(DWORD dwFlags);

DWORD dwFlags参数:
NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX    使用NUI中的带用户信息的深度图数据
NUI_INITIALIZE_FLAG_USES_COLOR                                        使用NUI中的彩色图数据
NUI_INITIALIZE_FLAG_USES_SKELETON                                  使用NUI中的骨骼追踪数据
NUI_INITIALIZE_FLAG_USES_DEPTH                                        仅仅使用深度图数据(如果你自己有良好的场景分析或物体识别算法,那么你应该用这个)


以上4个标志位,你可以使用一个,也可以用 | 操作符将它们组合在一起。例如:
HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_COLOR);//只使用彩色图
HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX | NUI_INITI

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 28
    评论
骨骼信息 Kinect是一种基于红外线技术的体感设备,可以捕捉人体骨骼信息彩色图像和深度图像等数据。而OpenCV是一个开源计算机视觉库,用于处理图像和视频数据。 在使用Kinect进行人体姿态识别等应用时,通常需要读取Kinect彩色图像、深度图像和骨骼信息等数据。而OpenCV提供了一种方便的方法来读取这些数据。 以下是使用KinectOpenCV读取彩色图像、深度图像和骨骼信息的步骤: 1. 安装Kinect SDKOpenCV库。Kinect SDK提供了Kinect的驱动程序和API,而OpenCV库用于处理图像和视频数据。 2. 初始化Kinect设备。使用Kinect SDK提供的函数初始化Kinect设备,包括彩色图像、深度图像和骨骼信息的获取。 3. 读取彩色图像。使用Kinect SDK提供的函数读取Kinect设备的彩色图像数据,并将其转换为OpenCV格式的图像数据。 4. 读取深度图像。使用Kinect SDK提供的函数读取Kinect设备的深度图像数据,并将其转换为OpenCV格式的图像数据。 5. 读取骨骼信息。使用Kinect SDK提供的函数读取Kinect设备的骨骼信息数据,并将其转换为OpenCV格式的数据。 6. 处理图像和骨骼信息数据。使用OpenCV库提供的函数对图像和骨骼信息数据进行处理,例如姿态估计、人体跟踪等应用。 7. 释放Kinect设备。使用Kinect SDK提供的函数释放Kinect设备的资源。 通过以上步骤,就可以使用KinectOpenCV读取彩色图像、深度图像和骨骼信息数据,并进行进一步的处理和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值