初次使用Kinect体感,并用OpenCV显示彩色景深骨骼图

1.     安装Kinect驱动

安装驱动前,看下右侧的Installation instructions,这里简单翻译下:

  1. 体感不要连在电脑上
  2. 如果以前装了Kinect SDK要卸载它
  3. 关闭Visual Studio2010

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失灵了),会看到右下角图标处有反应,双击出来看看。

初次使用Kinect体感,并用OpenCV显示彩色景深骨骼图_第1张图片

正在安装驱动中

初次使用Kinect体感,并用OpenCV显示彩色景深骨骼图_第2张图片

经过几分钟的等待,都安装上了!

初次使用Kinect体感,并用OpenCV显示彩色景深骨骼图_第3张图片

设备管理器中也可以看到,这里说明安装成功了。我们可以看到体感摄像头中间的绿灯闪烁。

如果你第二次安装(这一次很快),那显示下图:

初次使用Kinect体感,并用OpenCV显示彩色景深骨骼图_第4张图片

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”内容

你可能感兴趣的:(image,Microsoft,null,mfc,byte,64bit)