Kinect开发入门_详细教程

合集下载

[译]Kinect for Windows SDK开发入门(一):开发环境配置

[译]Kinect for Windows SDK开发入门(一):开发环境配置

[译]Kinect for Windows SDK开发入门(一):开发环境配置1. Kinect设备黑色的Kinect设备如下图:基座和感应器之间有一个电动马达,通过程序能够调整俯仰角度,在上面的感应器中有一个红外投影仪,两个摄像头,四个麦克风和一个风扇。

打开外面的盖子可以看到里面的构造:这些感应器用来捕捉RGB和深度数据,面对Kinect,从左往右看。

最左边是红外光源,其次是LED指示灯,再次彩色摄像头,用来收集RGB数据,最右边是红外摄像头用才采集景深数据。

彩色摄像头最大支持1280*960分辨率成像,红外摄像头最大支持640*480成像。

在感应器的下方是麦克风阵列,他包括四个不同的麦克风,一个左边的红外发射器下面,另外3个在右边景深摄像头下面。

初步了解了Kinect构造后,接下来看看开发环境的搭建:2. Kinect for Windows SDK软硬件环境Kinect for Windows SDK是一些列的类库,他能够使得开发者能将Kinect作为输入设备开发各种应用程序。

就像名字所显示那样,Kinect for Windows SDK只能运行在32位或者64位的windows7及以上版本的操作系统上。

∙硬件配置1一台电脑,当然内存越大越好(推荐2G或者以上),处理器频率(2.66GHz及以上)越高越好。

2Windows 7操作系统,以及支持Microsoft DirectX9.0c兼容的显卡3Kinect for Xbox360 Sensor(如果单买的话自带有USB Power Adapter,如果是和Xbox360套装一起捆绑的话,因为Xbox主机能够直接为Kinect外设提供电源,所以没有电源,需要另买USB Power Adapter)使用Visual Studio 2010 Express版本或专业版进行开发时,需要安装最新版本的Kinect for Windows SDK,包含有对Kinect的硬件驱动。

Kinect for Windows SDK开发入门(六):骨骼追踪基础 上

Kinect for Windows SDK开发入门(六):骨骼追踪基础 上

[译]Kinect for Windows SDK开发入门(六):骨骼追踪基础上Kinect产生的景深数据作用有限,要利用Kinect创建真正意义上交互,有趣和难忘的应用,还需要除了深度数据之外的其他数据。

这就是骨骼追踪技术的初衷,骨骼追踪技术通过处理景深数据来建立人体各个关节的坐标,骨骼追踪能够确定人体的各个部分,如那部分是手,头部,以及身体。

骨骼追踪产生X,Y,Z数据来确定这些骨骼点。

在上文中,我们讨论了景深图像处理的一些技术。

骨骼追踪系统采用的景深图像处理技术使用更复杂的算法如矩阵变换,机器学习及其他方式来确定骨骼点的坐标。

本文首先用一个例子展示骨骼追踪系统涉及的主要对象,然后在此基础上详细讨论骨骼追踪中所涉及的对象模型。

1. 获取骨骼数据本节将会创建一个应用来将获取到的骨骼数据绘制到UI界面上来。

在开始编码前,首先来看看一些基本的对象以及如何从这些对象中如何获取骨骼数据。

在进行数据处理之前了解数据的格式也很有必要。

这个例子很简单明了,只需要骨骼数据对象然后将获取到的数据绘制出来。

彩色影像数据,景深数据分别来自ColorImageSteam和DepthImageStream,同样地,骨骼数据来自SkeletonStream。

访问骨骼数据和访问彩色影像数据、景深数据一样,也有事件模式和“拉”模式两种方式。

在本例中我们采用基于事件的方式,因为这种方式简单,代码量少,并且是一种很普通基本的方法。

KinectSensor对象有一个名为SkeletonFrameReady事件。

当SkeletonStream 中有新的骨骼数据产生时就会触发该事件。

通过AllFramesReady事件也可以获取骨骼数据。

在下一节中,我们将会详细讨论骨骼追踪对象模型,现在我们只展示如何从SkeletonStream流中获取骨骼数据。

SkeletonStream产生的每一帧数据都是一个骨骼对象集合。

每一个骨骼对象包含有描述骨骼位置以及骨骼关节的数据。

Kinect开发环境

Kinect开发环境

Kinect开发环境今天我们主要是操作RGB Camera和Depth Sensor,首先,我们要完成Kinect开发环境的配置:第一步,创建WPF工程打开Visual Studio 2010,创建一个WPF工程,名叫KinectWpfDemo:当然,由于Kinect SDK中包含基于.NET的程序集,除了WPF外,我们使用.NET WinForm 或XNA框架都可以,目前还没有人在Silverlight平台上实验成功。

第二步,添加Kinect程序集的引用在Solution Explorer中,右键单击KinectWpfDemo,在右键菜单中选择“Add Reference…”。

在弹出的对话框中,我们在.NET标签页里,选择“Microsoft.Research.Kinect”程序集。

如下图所示:第三步,添加Coding4Fun Kinect Toolkit这是一个可选项,不过为了之后的编程方便,建议大家添加一个。

Coding4Fun Kinect Toolkit 的下载地址:/解压缩后,一共有五个文件,针对WinForm、WPF平台,还有一个Microsoft.Expression.Drawing.dll。

我们通过Add Reference,将Coding4Fun.Kinect.Wpf.dll添加进来。

获取RGB Camera数据第四步,添加控件双击打开MainWindow.xaml,在设计器中添加两个Image控件,一个用于显示RGB图像,另一个用于显示Depth信息。

第五步,引用命名空间打开MainWindow.xaml.cs文件,在文件头部添加对于Kinect对象的引用:using Microsoft.Research.Kinect.Nui;using Microsoft.Research.Kinect.Audio;using Coding4Fun.Kinect.Wpf;回到MainWindow.xaml的设计器中,在属性窗口中选择Event,找到Loaded和Closed两个方法,分别双击,添加两个事件的处理函数:在MainWindow.xaml.cs文件的MainWindow类中,声明Runtime的变量:Runtime nui;然后,在Loaded事件的处理函数中添加Runtime初始化的代码:privatevoid Window_Loaded(object sender, RoutedEventArgs e){nui = new Runtime();nui.Initialize(eColor| eDepth | eDepthAndPlayerIndex |eSkeletalTracking);}接下来是Closed事件中关闭Runtime的代码:privatevoid Window_Closed(object sender, EventArgs e){nui.Uninitialize();}Runtime对象是Kinect SDK中最主要的一个类,所有针对Kinect的操作都由Runtime类进行了封装。

Kinect开发教程三:利用OpenNI进行手势识别

Kinect开发教程三:利用OpenNI进行手势识别

这是第二个范例,小斤将介绍如何使用OpenNI让Kinect识别出手势,并显示输出。

目前版本的OpenNI支持四种手势:RaiseHand, Wave, Click和MovingHand,分别代表手的“举起”,“挥动”,“前推”和“移动”四种动作。

值得一提的是,当前微软官方的Kinect SDK还不支持手势识别,也可以说是使用OpenNI的好处之一吧。

有了手势识别后,其实可以利用Kinect做一些实际的东东,比如利用鼠标键盘控制一些应用程序等等。

闲话不说了,速度搞起。

代码一部分参考了,手势部分写得很完备了,在巨人的肩膀上,小斤使用OpenCV进行显示,红色点表示手的位置轨迹,蓝色实心圈表示前推的位置,黄色直线表示手挥动的轨迹(从起点到终点)。

1#include <stdlib.h>2#include <iostream>3#include "opencv/cv.h"4#include "opencv/highgui.h"5#include <XnCppWrapper.h>67using namespace std;8using namespace cv;910// output for XnPoint3D11ostream& operator<<( ostream& out, const XnPoint3D& rPoint )12{13 out << "(" << rPoint.X << "," << rPoint.Y << "," << rPoint.Z << ")";14return out;15}1617//【4】18// callback function for gesture recognized19void XN_CALLBACK_TYPE gestureRecog( xn::GestureGenerator &generator,20const XnChar *strGesture,21const XnPoint3D *pIDPosition,22const XnPoint3D *pEndPosition,23void *pCookie )24{25 cout << strGesture<<" from "<<*pIDPosition<<" to "<<*pEndPosition << endl; 2627int imgStartX=0;28int imgStartY=0;29int imgEndX=0;30int imgEndY=0;31char locationinfo[100];3233 imgStartX=(int)(640/2-(pIDPosition->X));34 imgStartY=(int)(480/2-(pIDPosition->Y));35 imgEndX=(int)(640/2-(pEndPosition->X));36 imgEndY=(int)(480/2-(pEndPosition->Y));3738 IplImage* refimage=(IplImage*)pCookie;39if(strcmp(strGesture,"RaiseHand")==0)40 {41 cvCircle(refimage,cvPoint(imgStartX,imgStartY),1,CV_RGB(255,0,0),2);42 }43else if(strcmp(strGesture,"Wave")==0)44 {45cvLine(refimage,cvPoint(imgStartX,imgStartY),cvPoint(imgEndX,imgEndY),CV_RGB(255 ,255,0),6);46 }47else if(strcmp(strGesture,"Click")==0)48 {49 cvCircle(refimage,cvPoint(imgStartX,imgStartY),6,CV_RGB(0,0,255),12);50 }5152 cvSetImageROI(refimage,cvRect(40,450,640,30));53 CvFont font;54 cvInitFont( &font, CV_FONT_VECTOR0,1, 1, 0, 3, 5);55 cvSet(refimage, cvScalar(255,255,255));56 sprintf(locationinfo,"From: %d,%dto %d,%d",(int)pIDPosition->X,(int)pIDPosition->Y,(int)(pEndPosition->X),(int)(p EndPosition->Y));57 cvPutText(refimage, locationinfo ,cvPoint(30, 30), &font, CV_RGB(0,0,0));58 cvResetImageROI(refimage);59}6061void clearImg(IplImage* inputimg)62{63 CvFont font;64 cvInitFont( &font, CV_FONT_VECTOR0,1, 1, 0, 3, 5);65 memset(inputimg->imageData,255,640*480*3);66 cvPutText(inputimg, "Hand Raise!",cvPoint(20, 20), &font, CV_RGB(255,0,0));67 cvPutText(inputimg, "Hand Wave!" , cvPoint(20, 50), &font,CV_RGB(255,255,0));68 cvPutText(inputimg, "Hand Push!", cvPoint(20, 80), &font, CV_RGB(0,0,255)); 69}7071//【5】72// callback function for gesture progress73void XN_CALLBACK_TYPE gestureProgress( xn::GestureGenerator &generator,74const XnChar *strGesture,75const XnPoint3D *pPosition,76 XnFloat fProgress,77void *pCookie )78{79 cout << strGesture << ":" << fProgress << " at " << *pPosition << endl; 80}818283int main( int argc, char** argv )84{85 IplImage* drawPadImg=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);86 IplImage* cameraImg=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);8788 cvNamedWindow("Gesture",1);89 cvNamedWindow("Camera",1);9091 clearImg(drawPadImg);9293 XnStatus res;94char key=0;9596// context97 xn::Context context;98 res = context.Init();99 xn::ImageMetaData imgMD;100101// create generator102 xn::ImageGenerator imageGenerator;103 res = imageGenerator.Create( context );104//【1】105 xn::GestureGenerator gestureGenerator;106 res = gestureGenerator.Create( context );108//【2】109// Add gesture110//gestureGenerator.AddGesture( "MovingHand", NULL );111 gestureGenerator.AddGesture( "Wave", NULL );112 gestureGenerator.AddGesture( "Click", NULL );113 gestureGenerator.AddGesture( "RaiseHand", NULL );114//gestureGenerator.AddGesture("MovingHand",NULL);115116 /【3】117// 6. Register callback functions of gesture generator118 XnCallbackHandle handle;119 gestureGenerator.RegisterGestureCallbacks( gestureRecog, gestureProgress, (void*)drawPadImg, handle );120121//start generate data122 context.StartGeneratingAll();123 res = context.WaitAndUpdateAll();124125while( (key!=27) && !(res = context.WaitAndUpdateAll()) )126 {127if(key=='c')128 {129 clearImg(drawPadImg);130 }131132 imageGenerator.GetMetaData(imgMD);133 memcpy(cameraImg->imageData,imgMD.Data(),640*480*3);134 cvCvtColor(cameraImg,cameraImg,CV_RGB2BGR);135136 cvShowImage("Gesture",drawPadImg);137 cvShowImage("Camera",cameraImg);138139 key=cvWaitKey(20);140141 }142 cvDestroyWindow("Gesture");143 cvDestroyWindow("Camera");144 cvReleaseImage(&drawPadImg);145 cvReleaseImage(&cameraImg);146 context.StopGeneratingAll();147 context.Shutdown();148149return 0;【1】看过上一篇文章的童鞋应该已经了解了生成器的用法(),对于手势识别,小斤使用了GestureGenerator这个生成器,它的创建方式与ImageGenerator一致,使用Context作为参数调用Create方法。

Kinect for Windows SDK开发入门(十三):语音识别 下

Kinect for Windows SDK开发入门(十三):语音识别 下

[译]Kinect for Windows SDK开发入门(十三):语音识别下上一篇文章介绍了Kinect中语音识别的基本概念,以及一些语音处理方面的术语。

在此基础上使用Kinect麦克风阵列来进行音频录制的例子说明了Kinect中音频处理的核心对象及其配置。

本文将继续介绍Kinect中的语音识别,并以两个小例子来展示语音识别中的方向识别和语音命令识别。

1. 使用定向麦克风进行波速追踪(Beam Tracking for a Directional Microphone)可以使用这4个麦克风来模拟定向麦克风产生的效果,这个过程称之为波束追踪(beam tracking),为此我们新建一个WPF项目,过程如下:1. 创建一个名为KinectFindAudioDirection的WPF项目。

2. 添加对Microsoft.Kinect.dll和Microsoft.Speech.dll的引用。

3. 将主窗体的名称改为“Find Audio Direction”4. 在主窗体中绘制一个垂直的细长矩形。

界面上的细长矩形用来指示某一时刻探测到的说话者的语音方向。

矩形有一个旋转变换,在垂直轴上左右摆动,以表示声音的不同来源方向。

前端页面代码:界面。

后台逻辑代码和之前的例子大部分都是相同的。

首先实例化一个KinectAudioSource赋值给本身。

将BeamAngleMode设置为Adaptive,使得能够自动追踪说话者的声音。

我们需要编写KinectAudioSource对象的BeamChanged事件对应的处理方法。

当用户的说话时,位置发生变化时就会触发该事件。

我们需要创建一个名为BeamAngle的属性,使得矩形的RotateTransform可以绑定这个属性。

public partial class MainWindow : Window, INotifyPropertyChanged{public MainWindow(){InitializeComponent();this.DataContext = this;this.Loaded += delegate { ListenForBeamChanges(); };}private KinectAudioSource CreateAudioSource(){var source = KinectSensor.KinectSensors[0].AudioSource;source.NoiseSuppression = true;source.AutomaticGainControlEnabled = true;source.BeamAngleMode = BeamAngleMode.Adaptive;return source;}private void ListenForBeamChanges(){KinectSensor.KinectSensors[0].Start();var audioSource = CreateAudioSource();audioSource.BeamAngleChanged += audioSource_BeamAngleChanged;audioSource.Start();}public event PropertyChangedEventHandler PropertyChanged;private void OnPropertyChanged(string propName){if (PropertyChanged != null)PropertyChanged(this, new PropertyChangedEventArgs(propName));}private double _beamAngle;public double BeamAngle{get { return _beamAngle; }set{_beamAngle = value;OnPropertyChanged("BeamAngle");以上代码中,还需要对BeamChanged事件编写对应的处理方法。

Kinect for Windows SDK开发入门(三):基础知识 下

Kinect for Windows SDK开发入门(三):基础知识 下

[译]Kinect for Windows SDK开发入门(三):基础知识下1. 性能改进上文的代码中,对于每一个彩色图像帧,都会创建一个新的Bitmap对象。

由于Kinect视频摄像头默认采集频率为每秒30幅,所以应用程序每秒会创建30个bitmap对象,产生30次的Bitmap内存创建,对象初始化,填充像素数据等操作。

这些对象很快就会变成垃圾等待垃圾回收器进行回收。

对数据量小的程序来说可能影响不是很明显,但当数据量很大时,其缺点就会显现出来。

改进方法是使用WriteableBitmap对象。

它位于System.Windows.Media.Imaging命名空间下面,该对象被用来处理需要频繁更新的像素数据。

当创建WriteableBitmap时,应用程序需要指定它的高度,宽度以及格式,以使得能够一次性为WriteableBitmap 创建好内存,以后只需根据需要更新像素即可。

使用WriteableBitmap代码改动地方很小。

下面的代码中,首先定义三个新的成员变量,一个是实际的WriteableBitmap对象,另外两个用来更新像素数据。

每一幅图像的大小都是不变的,因此在创建WriteableBitmap时只需计算一次即可。

InitializeKinect方法中加粗的部分是更改的代码。

创建WriteableBitmap对象,准备接收像素数据,图像的范围同时也计算了。

在初始化WriteableBitmap的时候,同时也绑定了UI元素(名为ColorImageElement的Image对象)。

此时WriteableBitmap中没有像素数据,所以UI上是空的。

还需要进行的一处改动是,对ColorFrameReady事件响应的代码。

如下图。

首先删除之前创建Bitmap那部分的代码。

调用WriteableBitmap对象的WritePixels方法来更新图像。

方法使用图像的矩形范围,代码像素数据的数组,图像的Stride,以及偏移(offset).偏移量通常设置为0。

Kinect开发教程五:OpenNI获取人体骨架

Kinect开发教程五:OpenNI获取人体骨架

临近毕业,小斤最近一直忙活着相关事宜,教程这边也搁浅了一阵。

前几篇教程介绍了OpenNI的一些基本范例以及手势应用,但如果光用Kinect识别一些手势,总有点杀鸡用牛刀的感觉。

在大部分体感应用中,获取骨架的步骤都不可缺少,这也是小斤一直想写的专题。

好了,废话不多说了,让我们进入正题吧!在OpenNI库的enum XnSkeletonJoint中,定义了24个人体的关节,如下:XN_SKEL_HEAD = 1, XN_SKEL_NECK = 2, XN_SKEL_TORSO = 3, XN_SKEL_WAIST = 4, XN_SKEL_LEFT_COLLAR = 5,XN_SKEL_LEFT_SHOULDER = 6,XN_SKEL_LEFT_ELBOW = 7, XN_SKEL_LEFT_WRIST= 8,XN_SKEL_LEFT_HAND = 9,XN_SKEL_LEFT_FINGERTIP =10,XN_SKEL_RIGHT_COLLAR =11, XN_SKEL_RIGHT_SHOULDER =12,XN_SKEL_RIGHT_ELBOW =13, XN_SKEL_RIGHT_WRIST =14,XN_SKEL_RIGHT_HAND =15,XN_SKEL_RIGHT_FINGERTIP =16,XN_SKEL_LEFT_HIP =17, XN_SKEL_LEFT_KNEE=18,XN_SKEL_LEFT_ANKLE =19, XN_SKEL_LEFT_FOOT=20,XN_SKEL_RIGHT_HIP =21, XN_SKEL_RIGHT_KNEE =22,XN_SKEL_RIGHT_ANKLE =23, XN_SKEL_RIGHT_FOOT =24小斤试下来,目前可使用的有14个关节,如下图:先上代码:1#include <stdlib.h>2#include <iostream>3#include <vector>45#include <XnCppWrapper.h>6#include <XnModuleCppInterface.h>7#include "cv.h"8#include "highgui.h"910using namespace std;11using namespace cv;1213//#pragma comment (lib,"cv210")14//#pragma comment (lib,"cxcore210")15//#pragma comment (lib,"highgui210")16//#pragma comment (lib,"OpenNI")1718//【1】19xn::UserGenerator userGenerator;20xn::DepthGenerator depthGenerator;21xn::ImageGenerator imageGenerator;2223/*24 XN_SKEL_HEAD = 1, XN_SKEL_NECK = 2,25 XN_SKEL_TORSO = 3, XN_SKEL_WAIST = 4,26 XN_SKEL_LEFT_COLLAR = 5, XN_SKEL_LEFT_SHOULDER = 6,27 XN_SKEL_LEFT_ELBOW = 7, XN_SKEL_LEFT_WRIST = 8,28 XN_SKEL_LEFT_HAND = 9, XN_SKEL_LEFT_FINGERTIP =10,29 XN_SKEL_RIGHT_COLLAR =11, XN_SKEL_RIGHT_SHOULDER =12,30 XN_SKEL_RIGHT_ELBOW =13, XN_SKEL_RIGHT_WRIST =14,31 XN_SKEL_RIGHT_HAND =15, XN_SKEL_RIGHT_FINGERTIP =16,32 XN_SKEL_LEFT_HIP =17, XN_SKEL_LEFT_KNEE =18,33 XN_SKEL_LEFT_ANKLE =19, XN_SKEL_LEFT_FOOT =20,34 XN_SKEL_RIGHT_HIP =21, XN_SKEL_RIGHT_KNEE =22,35 XN_SKEL_RIGHT_ANKLE =23, XN_SKEL_RIGHT_FOOT =24 36*/37//a line will be drawn between start point and corresponding end point 38int startSkelPoints[14]={1,2,6,6,12,17,6,7,12,13,17,18,21,22};39int endSkelPoints[14]={2,3,12,21,17,21,7,9,13,15,18,20,22,24};4041// callback function of user generator: new user42void XN_CALLBACK_TYPE NewUser( xn::UserGenerator& generator, XnUserID user,void* pCookie )43{44 cout << "New user identified: " << user << endl;45//userGenerator.GetSkeletonCap().LoadCalibrationDataFromFile( user, "UserCalibration.txt" );46 generator.GetPoseDetectionCap().StartPoseDetection("Psi", user); 47}4849// callback function of user generator: lost user50void XN_CALLBACK_TYPE LostUser( xn::UserGenerator& generator, XnUserIDuser,void* pCookie )51{52 cout << "User " << user << " lost" << endl;53}5455// callback function of skeleton: calibration start56void XN_CALLBACK_TYPE CalibrationStart( xn::SkeletonCapability&skeleton,XnUserID user,void* pCookie )57{58 cout << "Calibration start for user " << user << endl;59}6061// callback function of skeleton: calibration end62void XN_CALLBACK_TYPE CalibrationEnd( xn::SkeletonCapability&skeleton,XnUserID user,XnCalibrationStatus calibrationError,void* pCookie )63{64 cout << "Calibration complete for user " << user << ", ";65if( calibrationError==XN_CALIBRATION_STATUS_OK )66 {67 cout << "Success" << endl;68 skeleton.StartTracking( user );69//userGenerator.GetSkeletonCap().SaveCalibrationDataToFile(user, "UserCalibration.txt" );70 }71else72 {73 cout << "Failure" << endl;74//For the current version of OpenNI, only Psi pose is available75((xn::UserGenerator*)pCookie)->GetPoseDetectionCap().StartPoseDetection( "Psi", user );76 }77}7879// callback function of pose detection: pose start80void XN_CALLBACK_TYPE PoseDetected( xn::PoseDetectionCapability& poseDetection,const XnChar* strPose,XnUserID user,void* pCookie)81{82 cout << "Pose " << strPose << " detected for user " << user << endl;83 ((xn::UserGenerator*)pCookie)->GetSkeletonCap().RequestCalibration( user, FALSE );84 poseDetection.StopPoseDetection( user );85}8687void clearImg(IplImage* inputimg)88{89 CvFont font;90 cvInitFont( &font, CV_FONT_VECTOR0,1, 1, 0, 3, 5);91 memset(inputimg->imageData,255,640*480*3);92}939495int main( int argc, char** argv )96{97char key=0;98int imgPosX=0;99int imgPosY=0;100101// initial context102 xn::Context context;103 context.Init();104 xn::ImageMetaData imageMD;105106 IplImage* cameraImg=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); 107 cvNamedWindow("Camera",1);108109// map output mode110 XnMapOutputMode mapMode;111 mapMode.nXRes = 640;112 mapMode.nYRes = 480;113 mapMode.nFPS = 30;114115// create generator116 depthGenerator.Create( context );117 depthGenerator.SetMapOutputMode( mapMode );118 imageGenerator.Create( context );119 userGenerator.Create( context );120121//【2】122// Register callback functions of user generator123 XnCallbackHandle userCBHandle;124 userGenerator.RegisterUserCallbacks( NewUser, LostUser, NULL, userCBHandle );125126//【3】127// Register callback functions of skeleton capability128 xn::SkeletonCapability skeletonCap = userGenerator.GetSkeletonCap(); 129 skeletonCap.SetSkeletonProfile( XN_SKEL_PROFILE_ALL );130 XnCallbackHandle calibCBHandle;131 skeletonCap.RegisterToCalibrationStart( CalibrationStart,&userGenerator, calibCBHandle );132 skeletonCap.RegisterToCalibrationComplete( CalibrationEnd,&userGenerator, calibCBHandle );133134//【4】135// Register callback functions of Pose Detection capability136 XnCallbackHandle poseCBHandle;137userGenerator.GetPoseDetectionCap().RegisterToPoseDetected( PoseDetected,&userGe nerator, poseCBHandle );138139140// start generate data141 context.StartGeneratingAll();142while( key!=27 )143 {144 context.WaitAndUpdateAll();145146 imageGenerator.GetMetaData(imageMD);147 memcpy(cameraImg->imageData,imageMD.Data(),640*480*3);148 cvCvtColor(cameraImg,cameraImg,CV_RGB2BGR);149// get users150 XnUInt16 userCounts = userGenerator.GetNumberOfUsers();151if( userCounts > 0 )152 {153 XnUserID* userID = new XnUserID[userCounts];154 userGenerator.GetUsers( userID, userCounts );155for( int i = 0; i < userCounts; ++i )156 {157//【5】158// if is tracking skeleton159if( skeletonCap.IsTracking( userID[i] ) )160 {161 XnPoint3D skelPointsIn[24],skelPointsOut[24];162 XnSkeletonJointTransformation mJointTran;163for(int iter=0;iter<24;iter++)164 {165//XnSkeletonJoint from 1 to 24166skeletonCap.GetSkeletonJoint( userID[i],XnSkeletonJoint(iter+1), mJointTran ); 167 skelPointsIn[iter]=mJointTran.position.position;168 }169depthGenerator.ConvertRealWorldToProjective(24,skelPointsIn,skelPointsOut);170171//【6】172for(int d=0;d<14;d++)173 {174 CvPoint startpoint =cvPoint(skelPointsOut[startSkelPoints[d]-1].X,skelPointsOut[startSkelPoints[d]-1 ].Y);175 CvPoint endpoint =cvPoint(skelPointsOut[endSkelPoints[d]-1].X,skelPointsOut[endSkelPoints[d]-1].Y) ;176177 cvCircle(cameraImg,startpoint,3,CV_RGB(0,0,255),12);178 cvCircle(cameraImg,endpoint,3,CV_RGB(0,0,255),12);179cvLine(cameraImg,startpoint,endpoint,CV_RGB(0,0,255),4);180 }181 }182 }183delete [] userID;184 }185 cvShowImage("Camera",cameraImg);186187 key=cvWaitKey(20);188189190 }191// stop and shutdown192 cvDestroyWindow("Camera");193 cvReleaseImage(&cameraImg);194 context.StopGeneratingAll();195 context.Shutdown();196197return 0;198}【1】对于人体骨架的获取,小斤声明了UserGenerator这个生成器,UserGenerator具有检测新的User(以下称为人物)出现或者离开,获取画面中的人物数,人物位置信息,与上一教程介绍的GestureGenerator类似,通过注册回调函数的方式,一旦其检测到了动静(如人物出现),那么相应的回调函数就会被调用。

Kinect2.0教程(1)

Kinect2.0教程(1)
网站: 豆丁网 /p289115819.html / 官方网站 个人博客/dustpg 教程:
官网教程/
推荐一种最快的学习方法 官网教程或是看例子
Wii(任天堂)
2006 发布了wii游戏机,是任天堂公司的一次巨大的改革。 其中,wii主要以简单、运动为主要游戏模式。
Kinect2.0技术的基本原理
工作原理
由红外投影仪主动投射近红外光谱,照射到粗糙物体、 或是穿透毛玻璃后,光谱发生扭曲,会形成随机的反射 斑点(称为散斑),进而能被深度摄像头读取。深度摄 像头分析读取到的红外光谱并生成深度图。
Kinect2.0与Unity3D游戏引擎的 集成
Kinect2.0技术的Unity3D插件
插件使用及功能详细说明
数据引用基本流程: 以生成彩色图像为例说明代码:
存储对获取到的KincectSensor对象的引用
获取到当前已经开始运行的Kinect。 关闭Kinect。释放Kinect引用。
四个麦克风内置数字信号处理器DSP等组件,同时过滤 背景噪声,来定位声源方向。
Kinect2.0技术的基本原理
硬件系统组成
三只眼睛+四只耳朵
Kinect2.0技术的基本原理
硬件系统组成
三只眼睛:彩色摄像头、深度(红外)摄像头、红外 线投影机
彩色摄像头:用于拍摄视角范围内的彩色视 频图像。
2014年7月,正式版本的Kinect for windows v2.0以及 SDK 2.0 发布。
Kinect2.0技术简介
• 与Kinect技术竞争的平台或技术
Ps Move 索尼
全称PlayStation Move动态控制器,它和PlayStation3 USB 摄影机结合,创造全新游戏模式。PS MOVE不仅会辨识上 下左右的动作,还会感应手腕的角度变化。所以无论是运 动般的快速活动还是用笔绘画般纤细的动作也能在PS MOVE一一重现。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Page 14
14
NUI骨骼跟踪
Page 15
15
NUI骨骼跟踪
//new 初始化 nui = new Runtime();
nui.Initialize(eSkeletalTracking);
//加入驱动事件 nui.SkeletonFrameReady+=new EventHandler<SkeletonFrameReadyEventArgs>(nui_SkeletonFrameReady)驱动
1. 2. 创建一个 Runtime C# code: 初始化Runtime.Initialize
nui = new Runtime(); nui.Initialize(eSkeletalTracking);
11
NUI操作摄像头
//建立连接 nui = new Runtime(); //设置 初始化 nui.Initialize(eColor); //视屏 打开 nui.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color); //事实 视屏数据 nui.VideoFrameReady +=new EventHandler<ImageFrameReadyEventArgs>(nui_VideoFrameReady); //获取视屏数据 private void nui_VideoFrameReady(object sender, ImageFrameReadyEventArgs e) { image1.Source = e.ImageFrame.ToBitmapSource(); }
Page 12
12
NUI景深
Page 13
13
NUI景深
//new 和 初始化 nui = new Runtime();
nui.Initialize(eDepth);
//打开视屏流 nui.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.Depth); nui.DepthFrameReady+=new EventHandler<ImageFrameReadyEventArgs>(nui_DepthFrameReady); //景深 private void nui_DepthFrameReady(object sender, ImageFrameReadyEventArgs e) { image1.Source = e.ImageFrame.ToBitmapSource(); }
软件需求:
Microsoft Visual Studio® 2010 Express or other Visual Studio 2010 edition Microsoft .NET Framework 4.0 (installed with Visual Studio 2010)
Page 2
using Microsoft.Research.Kinect.Nui
For the Audio API, include: using Microsoft.Research.Kinect.Audio
Page 8
8
The NUI API: An Overview
NUI API是针对windows平台的kinect的库,他 支持: Kinect传感器,是连接到电脑。 获取图像和深度的数据流从Kinect图像传感 器。 形象和深度处理的数据支持骨骼跟踪。
4
安装步骤
2. Kinect SDK安装
Kinect SDK的安装过程非常简单, 无需任何设置,直接安装即可。
Page 5
5
安装步骤
3. 环境测试 Kinect SDK安装完成后, 我们将Kinect转接口的 USB接口插入到PC中。 PC会发现新硬件,并且自 动查找驱动程序安装。下 图是安装完成后的示意图:
或者 nui.Initialize(RuntimeOptions.Depth);
或者..................... 3 4. 添加 相应接口 关闭 Runtime.Shutdown
nui.Uninitialize();
Page 10
10
NUI操作摄像头
Page 11
Kinect SDK的官方论坛:
/Forums/en-US/kinectsdk/threads
Page 3
3
安装步骤
1. 硬件安装 下面的图片是Kinect和AC Adapter/ Power Supply:
Page 4
16
湖大 周圣韬
2
推荐
肯奶中国: 语言编译器:visual studio 2010 C#
Kinect SDK的视频开发教程: /Series/KinectSDKQuickstarts?sort=recent# tab_sortBy_recent Kinect SDK的开发指南: /enus/um/redmond/projects/kinectsdk/guides.aspx
Page 6
6
安装步骤
4. 测试程序 我们打开Kinect SDK中自带的 Sample Skeletal Viewer就可以很方 便地检测Kinect设备是否与PC已经 连接好了。
Page 7
7
C# 程序的应用接口
1.引用rence Microsoft.Research.Kinect.dll.. 2.调用库 namespaces: For the NUI API, include:
//获得所有骨骼 SkeletonFrame skeletonSet = e.SkeletonFrame; // 获得骨骼关节点的数据,类似于条件搜索
SkeletonData data = (from s in skeletonSet.Skeletons

Page 16
where s.TrackingState == SkeletonTrackingState.Tracked select s).FirstOrDefault();
Kinect入门
湖南大学 周圣韬

安装环境
Kinect for Windows SDK的下载地址: /enus/um/redmond/projects/kinectsdk/download.aspx 操作系统:Windows 7 (x86 or x64) 硬件需求:2.66-GHz DirectX® 9.0c 2 GB of RAM Kinect
相关文档
最新文档