1. 安装Kinect驱动
安装驱动前,看下右侧的Installation instructions,这里简单翻译下:
http://www.kinectforwindows.org/download/
根据硬件平台选择要装的驱动(64bit安装64bit驱动,32bit安装32bit驱动)
(1)KinectSDK-v1.0-beta2-x86.msi OR KinectSDK-v1.0-beta2-x64.msi
(2)看看自己硬件是否符合要求,使用的是VS2010和Win7系统(恰好这二个我已经熟悉了,很多人依旧不用VS2010)
(3)为了能运行他给出的SkeletalViewer程序我们还要安装Microsoft DirectX® SDK - June 2010 or later version 和Runtime for Microsoft DirectX® 9
(4)如果你要使用语音功能,使用SpeechSamples那么继续安装,把他给的后面三个驱动都装了。注意安装和硬件平台对应的驱动。
2.体感(Kinect)
买体感前确保它可以使用220V电源(我买的是台版,电压接受范围很大- -),一般买的是盒装的,他专门用于开发(但里面附增了一个正版游戏光碟,让我郁闷了)
先给体感连上电源,再把体感另一头USB接口连上电脑(那个附带的数据转换线是用来连接老式Xbox主机的,无视掉吧。)
如果你安装了驱动以及的USB没有问题(我第一次插入时USB失灵了),会看到右下角图标处有反应,双击出来看看。
正在安装驱动中
经过几分钟的等待,都安装上了!
设备管理器中也可以看到,这里说明安装成功了。我们可以看到体感摄像头中间的绿灯闪烁。
如果你第二次安装(这一次很快),那显示下图:
2.运行示例程序
程序在类似如下的目录,根据你安装的SDK目录了,如果默认这是c盘下。
Program Files\Microsoft SDKs\Kinect\v1.0Beta2\Samples\bin
你可以选择SkeletalViewer等运行试试效果。(注意骨骼图只有大于1.2米能会有效果)
3.最后再给出一个OpenCV打开摄像头的程序
首先要说明,本人虽然用64bit计算机但所有有关软件的配置都是按照32bit程序配置的,至今使用64bit电脑还么有写出过一个32bit的程序。囧。
配置问题:
打开项目属性页-à配置属性àVC++目录 中的”包含目录”,添加$(KINECTSDK_DIR)\inc,
库目录添加$(KINECTSDK_DIR)\lib\x86。
连接器—>输入à附加依赖项,添加MSRKinectNUI.lib
// kongzhitai.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> using namespace std; using namespace cv; //KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK #include "windows.h" #include "MSR_NuiApi.h" //KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK int main(int argc,char * argv[]) { //初始化NUI HRESULT hr = NuiInitialize( NUI_INITIALIZE_FLAG_USES_COLOR); if( hr != S_OK ) { cout<<"NuiInitializefailed"<<endl; return hr; } //打开KINECT设备的彩色图信息通道 HANDLE h1 = CreateEvent( NULL,TRUE, FALSE, NULL ); HANDLE h2 = NULL; hr = NuiImageStreamOpen( NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION_640x480, 0, 4, h1, &h2); if( FAILED( hr ) ) { cout<<"Could notopen image stream video"<<endl; return hr; } //开始读取彩色图数据 Matimg;img.create(480,640,CV_8UC3); uchar *pData; while(1) { WaitForSingleObject(h1,INFINITE); const NUI_IMAGE_FRAME *pImageFrame = NULL; hr = NuiImageStreamGetNextFrame( h2, 0, &pImageFrame ); if( FAILED( hr ) ) { cout<<"GetImage Frame Failed"<<endl; continue; } INuiFrameTexture * pTexture =pImageFrame->pFrameTexture; NUI_LOCKED_RECT LockedRect; pTexture->LockRect( 0,&LockedRect, NULL, 0 ); if( LockedRect.Pitch != 0 ) { BYTE * pBuffer = (BYTE*)LockedRect.pBits; for(int i=0;i<480;i++) { pData=img.ptr<uchar>(i); for(int j=0;j<640;j++) { for(int k=0;k<3;k++) *(pData+j*3+k)=*(pBuffer+i*4*640+j*4+k); } } imshow("rgb",img); waitKey(36); imwrite("H:\\out.jpg",img); } if( LockedRect.Pitch != 0 ) { BYTE * pBuffer = (BYTE*)LockedRect.pBits; //显示x200y400位置上的像素信息 pBuffer +=(200+399*640)*4; printf("x:200 y:400坐标处的像素颜色:r:%d g:%d b:%d\n",pBuffer[2],pBuffer[1],pBuffer[0]); } else { cout<<"Bufferlength of received texture is bogus\r\n"<<endl; } //释放本帧数据,准备迎接下一帧 NuiImageStreamReleaseFrame(h2, pImageFrame ); } //关闭NUI链接 NuiShutdown(); return 0; }
不过此程序占用CPU比较大,本人i7机器上,占用了20%,有时会飙到30%,十分郁闷。通过方法改进也没有改进出来。而微软给的例子的效果特别好,只占用5%的CPU。我以为是DirectX的问题,这二天用MFC改写了下,效果依旧很差,发现也不是DirectX的问题。而微软使用底层API函数写的,效率却很高,弄了半天也没弄明白。接下来如果有空,我将分享一下在MFC下开发Kinect的经验(就是把图像显示出来,不影响按钮的操作)。目前有些问题还没有很好的解决,所以不能把不够成熟的东西拿出来。先说下,我在MFC下的框架用了多线程(工作者线程),工作者线程中通过SendMessage向主线程发送消息处理。暂时没有考虑到线程同步啊,锁啊之类东西。如果有人知道更好的方法,欢迎留言。
附录
1. 参考网站,http://www.cnkinect.com/
2. 百度文库: Kinect(幻象)sdk编程指南
3. 百度文库: skeletalviewer中文文档
安装过程的问题
安装MicrosoftDirectX SDK(June 2010)发生错误。(不过我发现,他是最后才发生错误的,对程序实际运行目前发现没有任何影响。下面是有些人的解决方法,如果你无法运行SkeletalViewer,可能需要参考下)
http://www.docin.com/p-60410380.html#
regedit.打开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectX
里面有2个选项要修改,一个是Version,一个也许是ManagedDirectXVersion或者其他Version,把这2个值都改小,改成能正常安装为止,可以参考”C:\Windows\DirectX.log”内容