您的位置:首页 > 其它

Kinect 应用开发实践之笔记(一)

2014-08-15 15:35 246 查看
SDK 1.5 版本

提供的功能:

1、彩色图像获取

2、深度图像获取

3、骨骼跟踪数据获取

4、音频流获取

没有提供的功能:

1、姿势识别

2、动作识别

3、手势识别

。。。。。。

针对没有提供的高级功能,很多都可以根据深度数据进行相应的处理而获得。

最多支持 4 个设备同时连接在一台计算机上,但应用程序只能指定一个设备进行骨骼追踪。可以通过多进程实现多设备同时进行骨骼追踪。每个 Kinect 传感器都是独享设备

应用层 API 详解

初始化 NUI Api 和使用 Kinect 传感器的步骤如下:

C#:

1、获得 Kinect 实例

// LINQ
KinectSensor sensor = ( from sensorToCheck in KinectSensor.KinectSensors 
	where sensorToCheck.Status == KinectStatus.Connected
	select sensorToCheck).FirstOrDefault();

// foreach
foreach( KinectSensor s in KinectSensor.KinectSensors )
{
	if( s.Status == KinectStatus.Connected )
	{
		sensor = s;
		break;
	}
}

2、初始化并启动 Kinect 传感器

c#:

KinectSensor.Start

C++ :

NuiInitialize( /*指定要初始化的设备*/ );// 对于没有指定的,在后面是不可能得到其数据的。

NuiShutdown(); // 关闭设备,记住在退出的时候关闭设备,否则可能影响其它的应用使用设备

3、可以轮询或注册事件的方法获取数据流:

轮询模型是一种拉的方法,当程序想获取数据的时候调用相应的 API 检查是否有可用的数据,还可以指定等待的时间,如果在这段时间之后还没有数据产生则结束等待。各种图像帧的获取方法如下:

C#:

请求彩色图像帧的方法:ColorImageStream.OpenNextFrame(T);// 等待 T 毫秒

请求深度图像帧的方法:DepthImageStream.OpenNextFrame(T);

请求骨骼数据帧的方法:SkeletonImageStream.OpenNextFrame(T);

C++:

NuiImageStreamOpen(...) //打开图像流,通过指定参数可以打开彩色图像设备或深度图像设备。

NuiSkeletonTrackingEnable();// 打开骨骼追踪功能

NuiImageStreamGetNextFrame( T,...);

NuiSkeletonGetNextFrame(T,...);

事件方法:

C#:

注册相应的事件:KinectSensor.ColorFrameReady、KinectSensor.DepthFrameReady、KinectSensor.SkeletonFrameReady、KinectSensor.AllFrameReady

C++:

在打开流的时候传入一个事件参数,然后利用 WaitForSingleObject()对相应的函数进行等待,等待完成后在调用 Nui...GetNextFrame(0,)获取帧。

注意事项:

1、不能对同一数据流同时使用这两种模式。

2、可以利用轮询模式保持深度图像和彩色图像的同步:利用 Timestamp 属性。

数据流概述:

数据流采集到的数据会存放在缓冲区中,一般而言程序应该在数据流填充满缓冲区之前获取流,否则新来的流将覆盖缓冲区中的数据,导致数据帧的丢失。一个应用程序最多可以申请4个缓冲区,建议2个。

受限于 USB2.0 接口,在数据传输的时候速度上限低。因此在选取图像质量的时候要因地制宜:高质量图像需要更大的缓冲区,较低的传输速率(每秒的帧数更小);反之,图像传输速率的提高将会影响图像的质量。

1、彩色图像数据:


Kinect 彩色图像数据有以下两种:

1、RGB color 32 bit


2、YUV color 16 bit

2、深度图像数据:

深度数据流中的每个像素使用高 13 位记录图像深度(毫米),低 3 位记录用户 ID,如果深度数据是 0 表示深度未知。当骨骼追踪引擎被关闭的时候,用户 ID 为 0;

骨骼跟踪:

属于后期处理的高级功能,是根据获取得到的数据经过处理而得。应用程序最多可以同时“主动跟踪” 2 个用户,“被动跟踪” 4 个用户。

主动跟踪可以得到被跟踪用户的 20 个关节点的数据,被动跟踪只能获取用户的位置数据:HIP_CENTER

默认情况下对最先被捕捉的用户采用主动跟踪。也可以人为指定主动跟踪的用户。

对于 C# 可以利用 AppChoosesSkeletons 属性和 ChoosesSkeletons 方法。把 AppChoosesSkeletons 设置为 true。然后调用 ChoosesSkeletons( ID ) 方法即可。

对于 C++ :(暂时未知)

NUI 坐标转换

Kinect SDK NUI API 使用了三个坐标系:彩色图像二维坐标系、深度图像空间坐标系、骨骼跟踪空间坐标系。这三个坐标系之间的坐标和度量等并不一致,SDK 中提供了方法进行坐标系的互相转换:

C#:KinectSensor 类:

MapDepthToColorImagePoint();

MapDepthToSkeletonPoint();

MapSkeletonPointToColor();

MapSkeletonPointToDepth();

C++:

NuiTransformSkeletonToDepthImage

NuiImageGetColorPixelCoordinatesFromDepthPixel

NuiTransformDepthImageToSkeleton

深度图像帧的 X,Y 坐标不表示实际环境的位置坐标,而是表示在传感器上对应的坐标,即像素坐标。Z 方向的坐标表示的是该点距离红外摄像头所在平面的距离:mm

骨骼图像坐标的单位是 m,表示的是实际环境的位置坐标。Z 轴表示红外摄像头光轴,正方向朝向用户。符合右手坐标系。注意:如果 Kinect 的红外摄像头没有跟地面方向水平则得到的图像可能会倾斜。对于这种情况可以利用 Kinect 里面的传感器阵列进行倾斜补偿,貌似 SDK 没有提供该功能,只能由用户进行补偿。此外,在每个骨骼帧中均包含一个描述重力的值。此外
SDK 还可以进行地面测量。

骨骼镜像:

默认情况下,用户图像实际上是一个镜像数据。如果要转换到费镜像数据只需要把 X 坐标取反即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: