一.
Kinect是Xbox360上的体感外设,可以被应用到PC机上,提供动作捕捉、语音识别功能。类似于任天堂的Wii、PS Move,区别在于Kinect无需借助任何外设进行动作捕捉,目前只支持人类动作的捕捉。Kinect设备被应用于游戏行业中的体感游戏。
二.
2011年6月,微软发布了Kinect for Windows SDK测试版本,此版本为非商业授权版本,商业授权将在下一个版本中提供。这套SDK的开发环境需求如下:
硬件
1.
2.
软件
1.
2.
3.
这套SDK提供给我们的功能主要有骨骼追踪、未加工的深度图像流以及音频功能。在体感游戏开发中,我们主要使用到的是骨骼追踪功能。
搭建开发环境:
1.
2.
http://www.microsoft.com/visualstudio/en-us/products/2010-editions/express
3.
http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/download.aspx
注意:安装Kinect SDK需要确认VS2010开发工具已经正确安装完毕,因为Kinect SDK需要.NET4.0的支持才会正确安装,VS2010中集成了.NET4.0。另外需要注意的是,在安装SDK之前,请拔掉Kinect设备,安装成功后插入设备,系统会自动安装驱动。
完成上述步骤后,连接Kinect设备后会有绿灯闪烁,打开开始菜单,找到SDK目录,运行SDK提供的Sample,验证设备是否能够有效工作。
可能需要用到的资源包:
1.
http://www.microsoft.com/download/en/details.aspx?id=23714
2.
http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.3.1/
3.
http://www.microsoft.com/download/en/details.aspx?id=14373
和语音识别相关的开发包还需下载:
Kinect for Windows Runtime Language Pack
http://go.microsoft.com/fwlink/?LinkId=220942
Microsoft Speech Platform – Server Runtime
http://www.microsoft.com/download/en/details.aspx?id=24974
三.
下面我们来介绍一下在体感游戏中使用比较多的骨骼追踪功能如何实现。我们使用C++语言进行描述。
1.
包含目录中加入 $(MSRKINECTSDK)\inc
库目录中加入
这里的MSRKINECTSDK是环境变量,在我们正确安装微软Kinect for Windows SDK后,会在计算机的环境变量中看到。
2.
3.
#include <windows.h>
#include “MSR_NuiApi.h”
4.
HRESULT NuiInitialize(DWORD dwFlags);
dwFlags参数是以标志位的含义存在的。我们可以使用下面几个值来制定我们打算使用Kinect设备中的哪些内容。
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_DPTH
仅仅使用深度图数据
以上4个标志位,我们可以使用一个,也可以用|操作符将他们组合在一起使用。
一个应用程序对应一个Kinect设备,必须要调用初始化函数一次,并且只能调用一次。如果在这之后又调用一次初始化,势必会引起逻辑错误,即使是两个不同的程序。比如你运行一个SDK的例子,在没关闭它的前提下,再运行一个,那么后运行的就无法初始化成功,但不会影响之前的程序继续运行。另外,开发Kinect程序时,需要记得的是,微软SDK中提供的运行环境在处理Kinect设备传输数据时,是遵循下面3步骤的运行管线的。
NuiInitialize就是应用程序用通过传递给dwFlags参数具体值,来初始化这个管线中必须的阶段。因此,我们总是现在标志位中指定图像类型,才可以在接下来的环节中去调用NuiImageStreamOpen之类的函数。
好的,现在我们初始化一下NUI,本此描述只对骨骼数据感兴趣,那么标志如何设置?你懂的!
HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_SKELETON);
If(FAILED(hr))
{
}
Else
{
}
5.
VOID NuiShutdown();
这个函数,没什么可说的,当我们的程序退出时,都应该调用一下。甚至于,你的程序暂时不使用Kinect设备了,就应该放开对设备的控制权。
6.
NuiSkeletonTrackingEnabl
这个函数是打开骨骼追踪功能,让Kinect设备能够为我们提供人体各关节数据。值得一提的是第一个hNextFrameEvent参数,当一个新帧的骨骼数据到来时,这个hNextFrameEvent事件被触发,我们可以用CreateEvent事先创建一个事件传递给这个参数,这个参数也可以被设定为NULL。
我们在实现这个骨骼追踪功能时,使用了一个线程在不断监听hNextFrameEvent这个事件,当被触发时就调用处理接口来处理从Kinect设备获得的骨骼关节数据。
7.
NuiSkeletonGetNextFrame(dwMillisecondsToWait,pSkeletonFrame);
dwMillisecondsToWait参数是等待返回下一帧的时间,如果为0,代表立即返回。
pSkeletonFrame参数是NUI_SKELETON_FRAME类型的结构体,它包含一个骨骼帧所包含的所有数据。因此,我们使用是可以这样使用:
NUI_SKELETON_FRAME SkeletonFrame;
在获得到一帧数据时,我们需要检查这一帧数据中是否拥有人体骨骼数据,也就是说骨骼数据是否被追踪到。如果追踪到了,我们接下来需要对追踪到的骨骼帧数据进行降噪,使帧之间的骨骼数据尽量平滑。需要用到的函数是:
NuiTransformSmooth(pSkeletonFrame, pSmoothingParams);
pSkeletonFrame参数为上面获得的骨骼数据帧。
pSmoothingParams参数为降噪的一些参数,置为NULL就为默认参数。
8.
for( int i = 0 ; i < NUI_SKELETON_COUNT ; i++ )
{
}
NUI_SKELETON_COUNT宏是代表当前可支持的最大人体追踪数量,我们可以看出,每当某个人的ID被NUI_SKELETON_TRACKED到时,就去调用处理函数来处理我们获得的数据。那么SkeletonFrame.SkeletonData[i]数据便是第i个人的骨骼关节数据。我们在使用是可以这样:
NUI_SKELETON_DATA Data;
int HandRightX = Data.SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].x;
这样我们就实现了对右手骨骼关节的追踪。
9.
初始化
HRESULT
{
m_hNextSkeletonEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
HRESULT
hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX | NUI_INITIALIZE_FLAG_USES_SKELETON);
if( FAILED( hr ) )
{
}
hr = NuiSkeletonTrackingEnabl
if( FAILED( hr ) )
{
return hr;
}
m_hEvNuiProcessStop=CreateEvent(NULL,FALSE,FALSE,NULL);
m_hThNuiProcess=CreateThread(NULL,0,Nui_ProcessThread,NULL,0,NULL);
return hr;
}
{
if( m_hNextSkeletonEvent && (m_hNextSkeletonEvent != INVALID_HANDLE_VALUE))
}
{
bool bFoundSkeleton = true;
}
static DWORD WINAPI Nui_ProcessThread(LPVOID pParam)
{
hEvents,FALSE,100);
}
四.
1.
2.
3.
五.
1.
http://channel9.msdn.com/Series/KinectSDKQuickstarts?sort=recent#tab_sortBy_recent
2.
http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/guides.aspx
3.
http://social.msdn.microsoft.com/Forums/en-US/kinectsdk/threads
六.
1.
Microsoft`s Kinect SDK(Beta)
优点
缺点
PrimeSense OpenNI
优点
缺点
结论
微软Kinect SDK在骨骼识别和音频方面有优势。OpenNI似乎更适合做一些带颜色的点云的工作,在非Win7平台来开发商业项目。在手势识别方面,如果你想开发基于上半身或手识别的项目,可以使用OpenNI;如果是全身识别毋庸置疑微软的Kinect SDK是最好的,但是作为代价,你必须自己编写手势识别代码。
源自:http://blog.sina.com.cn/s/blog_4c75bd8c0100zs7o.html
欢迎转载,转载请注明出处.