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 实例
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 坐标取反即可。
提供的功能:
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 坐标取反即可。
相关文章推荐
- Flex企业应用开发实践学习笔记(七)——Flex Application
- Flex企业应用开发实践学习笔记(四)-------组件的布局
- 云计算、服务-云计算应用开发实践学习笔记-by小雨
- Kinect开发笔记之六Kinect Studio的应用
- 《深入理解OSGi:Equinox原理、应用与最佳实践》笔记_2_建立开发环境
- Flex企业应用开发实践学习笔记(八)——Flex on Java企业应用架构
- 《深入理解OSGi:Equinox原理、应用与最佳实践》笔记_2_建立开发环境
- Kinect开发学习笔记之(一)Kinect介绍和应用
- Kinect开发学习笔记之(一)Kinect介绍和应用
- Kinect开发学习笔记之(一)Kinect介绍和应用 (转)
- Kinect开发学习笔记之(一)Kinect介绍和应用
- Kinect开发学习笔记之(一)Kinect介绍和应用
- Kinect开发学习笔记之(一)Kinect介绍和应用
- Flex企业应用开发实践学习笔记(五)-------组件失效机制
- 云计算应用开发实践学习笔记
- Kinect开发学习笔记之(一)Kinect介绍和应用
- Kinect开发学习笔记之(一)Kinect介绍和应用
- Kinect开发学习笔记之(一)Kinect介绍和应用
- Kinect开发学习笔记之(一)Kinect介绍和应用
- Kinect开发学习笔记之(一)Kinect介绍和应用