Windows 7 + QT + OpenNI + Kinect + OpenCV 环境配置
- 格式:docx
- 大小:202.47 KB
- 文档页数:3
Kinect开发Windows7 环境的 Kinect SDK Beta(开发工具包),需要Microsoft .NET Framework 4.0、Microsoft Visual Studio 2010,使用 C++, C#, VB 等开发语言。
硬件要求是双核 2.66GHz CPU,至少 2GB 内存建议 4GB,支持 DirectX 9 的显卡。
微软发布的Kinect SDK包含以下三方面功能:原始传感器流:该功能可以从深度传感器、彩色摄像头传感器、麦克风等传感器中获取原始数据流,并可以使开发者在由Kinect传感器中所产生的低层次的数据流基础上进行开发。
骨骼追踪技术:该功能可以追踪一至两名用户在Kinect区域内活动时的骨骼图像,并可以为开发者提供更方便的途径开发动作应用程序。
高级音频功能:音频处理功能包括高级的噪音处理、回声消音,并可以辨别当前发声源,以及将这些数据信息导入Windows语音识别应用程序中。
安装环境:首先来说,Kinect for Windows SDK的下载地址:/en-us/um/redmond/projects/ kinectsdk/download.aspxKinect SDK目前只支持Windows 7,分为x86和x64两个版本。
开发工具方面还需要.NET Framework 4.0和Visual Studio 2010 (最低Express版本)的支持。
Kinect SDK的视频开发教程:/Series/KinectSDKQuickstarts?sort=r ecent#tab_sortBy_recentKinect SDK的开发指南:/en-us/um/redmond/projects/kin ectsdk/guides.aspxKinect SDK的官方论坛:/Forums/en-US/kinectsdk/thr eads硬件设备的需求是:Kinect for Xbox 360 sensor和Xbox 360 Kinect AC Adapter/ Power Supply。
Win7(X64/x86)Qt creator OpenCV2.3配置(v2.0)guo8113说明:对Qt creator、Opencv、mingw不做解释,不懂自己查资料1、需要的软件:(所有软件均可联系本人)QtCreator2.3下载地址:qt官网qt-win-opensource-4.8.4-mingw(qt官网下载)MinGW-gcc440_1(经测试3.X的版本是安装不成功的,我在这上面最少浪费了半天时间)OpenCV-2.3.1-win-superpackcmake-2.8.10.2-win32-x86/cmake/resources/software.html2、软件安装:所有软件安装到C盘根目录下,切记不可有中文目录⏹解压或安装MinGW-gcc440_1,至C盘c:\mingw添加系统环境变量“计算机->右键属性->高级系统设置-》高级”在系统环境变量新建:变量名mingw值C:\mingw⏹安装cmake⏹安装opencv⏹安装qt和qtcreator3、编译与安装3.1 Cmake生成opencvmakefile打开cmake配置源码与安装路径源码路径要包括以下内容目标路径笔者设置为c:\Qt\opencv23.2配置:configure:在下面的选择框选择mingw makefiles,点击finish3.3生成:点击generate3.4进入设置好的目标路径执行在cmd里输入cd c:\Qt\OpenCV2输入:mingw32-make进行编译等待40分钟左右编译完成:执行mingw32-make install进行安装:安装完之后将opencv的bin目录添加到环境变量4配置QTcreator打开QTcreator,工具-选项配置几项如下图:编译器mingwQTCmake5.QT creator配置把c:\Qt\OpenCV2目录下install文件夹中的所有文件包含bin lib include 文件夹,拿到c:\Qt\OpenCV2下(这几个是必须的,其他的可以删掉)。
Kinect动作捕捉系统介绍一、关于Kinect1、简介Kinectfor Xbox 360,简称Kinect,是由微软开发,应用于Xbox 360 主机的周边设备。
它让玩家不需要手持或踩踏控制器,而是使用语音指令或手势来操作Xbox360 的系统界面。
它也能捕捉玩家全身上下的动作,用身体来进行游戏,带给玩家“免控制器的游戏与娱乐体验”。
其在2010年11月4日于美国上市,建议售价149美金。
Kinect在销售前60天内,卖出八百万部,目前已经申请金氏世界记录,成为全世界销售最快的消费性电子产品。
2012年2月1日,微软正式发布面向Windows系统的Kinect版本“Kinect for Windows”,建议售价249美金。
Kinect有三个镜头,中间的镜头是RGB 彩色摄影机,用来采集彩色图像。
左右两边镜头则分别为红外线发射器和红外线CMOS 摄影机所构成的3D结构光深度感应器,用来采集深度数据(场景中物体到摄像头的距离)。
彩色摄像头最大支持1280*960分辨率成像,红外摄像头最大支持640*480成像。
Kinect还搭配了追焦技术,底座马达会随着对焦物体移动跟着转动。
Kinect也内建阵列式麦克风,由四个麦克风同时收音,比对后消除杂音,并通过其采集声音进行语音识别和声源定位。
2013年11月22日,随着xbox one的发售,kinect也更新为2.0版本。
二代和一代的主要区别在于它是专门为XboxOne设计,外形作了改进,精度更高,在捕捉在捕捉肢体动作和表情的基础上,增加了手指动作捕捉和心跳感应。
强化了分辨率至1080P,每秒处理的数据最多达2GB,镜头捕捉角度也增加至60%。
2、硬件功能3、安装部署除自定义应用程序处理外,对于将大量使用Kinect for Windows v2 身体跟踪的应用程序,建议使用下面的计算机配置作为参考。
该方案允许kinect发挥绝佳的性能,同时仍然能容纳附加的应用程序处理并维持最佳帧速率。
Kinect+OpenNI学习笔记之2(获取kinect的颜色图像和深度图像)前言网上有不少使用Qt做界面,OpenNI为库来开发kinect。
或许大家的第一个问题就是询问该怎样使用Kinect来获取颜色信息图和深度信息图呢?这一节就是简单来回答这个问题的。
开发环境:QtCreator2.5.1+OpenNI1.5.4.0+Qt4.8.2实验说明:在使用OpenNI来驱动读取kinect数据时,我们需要了解context object这个名词。
查看了下OpenNI UserGuide文档,简单翻译下这个名词的意思:Context是openNI中一个主要的object,它掌握了OpenNI使用过程中应用程序的全部状态,以及这些状态的prodection chains,一个应用程序有多个context,但是这些context之间不能共享信息。
例如一个中间件节点不能使用另一个context的驱动节点。
Context在使用前必须被立即初始化,因此此时所有嵌入的模块被下载和分析。
为了释放context的内存,应用程序需调用shutdown程序。
虽然翻译得不准确,但是它的大概意思就是告诉我们在驱动kinect时,需要用到context这个类,且我们需要安装一定顺序去使用,这与一些常见的库驱动差不多,比如opengl,这些都需要什么初始化啊,设置属性啊等。
因此我们只需要直接去看懂他人的一个工程实例就ok了。
好了,本文参考Heresy的教程中的源码写的。
在新建好工程文件后,需要包含XnCppWrapper头文件,且需在Qt工程中设置好头文件目录和库文件目录。
使用OpenNI读取颜色图和深度图的步骤如下(这个是程序的核心部分):1. 定义一个Context对象,并调用该对象的Init()方法来进行初始化。
2. 定义一个XnMapOutputMode格式对象,设置好分图像分辨率和帧率。
3. 定义颜色图和深度图的节点对象,并用其Create()方法来创建,参数为Context对象.4. 设置颜色和深度图的输出模式,调用的方法是SetMapOutputMode();参数为步骤2中定义和设置好了的XnMapOutputMode对象。
[OpenCV] -- win7下配置OpenCV的Qt开发环境Email : hahayacoder@0 编译、配置OpenCV的工程相当曲折,编译OpenCV不下5次,一开始还以为是自己的配置、编译步骤有问题,后来发现原来是自己电脑装的Qt Creator版本有点低,里面的MingW版本较低,而OpenCV下载的是最新版本,最新版本的OpenCV需要高版本的MingW。
最后果断换成高版本Qt Creator,终于编译成功。
1 下载所需工具(1)Qt Creator 下载地址 (建议下载最新版本,因为里面带的MinGW版本较高,我最开始使用Qt 4.7.4编译OpenCV-2.4.4一直报错,后来换成Qt 5.0.1编译成功)(2)OpenCV 下载地址/(不建议下载最新版本,最新版本的编译需要高版本的MinGW,不然在执行mingw32-make命令会报错)(3)CMake 下载地址/cmake/resources/software.html2 安装Qt Creator,过程很简单,一直下一步就OK3 安装OpenCV,设置解压路径就OK4 安装CMake,过程同样很简单(注意:(1)安装路径不能有中文和空格(2)勾选加入所有境变量中)5 目前最新的OpenCV版本,安装之后的目录下面有源码和个版本的lib和dll,不过为避免出现问题,还是自己编译6 将C:\Qt\Qt5.0.1\Tools\MinGW\bin加入系统的Path环境变量(假设Qt Creator安装在C盘)7 打开CMake,使用CMake编译OpenCV。
配置源码路径与生成的目标路径(1)源码路径:要选择OpenCV安装目录下含有如下文件的文件夹(2)目标路径:可以随意设置8 点击Configure配置按钮。
在弹出的对话框中选择MinGW makefiles,其余选项保持默认,点击Finish按钮,开始编译9 CMake编译结束界面如下图,勾选生成列表中的WITH_OPENGL和WITH_QT两项,其他项最好不要改动有一点需要注意一下,第二次configure的时候,会报错,说QT5CORE_DIR等等找不到,这一条上述教程里面没有说,我搜索了一下之后发现这个方法可以解决这个问题点击Cmake的entry,然后添加如下的信息,左边不变,右边为你的qt5的路径。
临近毕业,小斤最近一直忙活着相关事宜,教程这边也搁浅了一阵。
前几篇教程介绍了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类似,通过注册回调函数的方式,一旦其检测到了动静(如人物出现),那么相应的回调函数就会被调用。
Microsoft Kinect SDK 和PrimeSense OpenNI 的区别After playing with both the Microsoft Kinect SDK and the PrimeSense OpenNI SDK here are some of my thoughtsNote that the Microsoft’s SDK version is the Beta version, so things may change when the final one is released)Microsoft’s Kinect SDK (Beta)pro: 优点∙support for audio 支持音频∙support for motor/tilt 支持马达∙full body tracking: 全身追踪∙does not need a calibration pose 不需要标定姿势(投降姿势)∙includes head, hands, feet, clavicles包括头,手,脚和锁骨∙seems to deal better with occluded joints 看起来处理关节闭塞更好些supports multiple sensors 支持多传感器(多台Kinect)single no-fuss installer 简化安装(安装更容易)SDK has events for when a new Video or new Depth frame is available 当新的视频或深度图有效时,SDK会有可用事件con: 缺点∙licensed for non-commercial use only 非商用(商业需要付费)∙only tracks full body (no mode for hand only tracking) 只能追踪全身(不包含特定的追踪模式:例如只追踪手)∙does not offer alignment of the color&depth image streams to one another yet although there are features to align individual coordinates∙and there are hints that support may come laterfull body tracking: 全身追踪only calculates positions for the joints, not rotations 关节只有坐标数据,没有旋转数据only tracks the full body, no upperbody or hands only mode只能追踪全身,不包含特定的追踪模式:例如只追踪手或上半身∙seems to consume more CPU power than OpenNI/NITE (not properly benchmarked) 和OpenNI/NITE相比,看起来更消耗CPU(没有采用适当的基准)no gesture recognition system 不包含手势识别系统no support for the PrimeSense and the ASUS WAVI Xtion sensors? (can anyone confirm this?) 不支持PrimeSense和华硕的WAVI Xtion 硬件平台only supports Win7 (x86 & x64) 只支持Win7(32位和64位)no support for Unity3D game engine 不支持Unity3D游戏引擎no built in support for record/playback to disk 不支持数据记录或回放到硬盘no support to stream the raw InfraRed video data 不支持红外线视频数据流SDK does not have events for when new user enters frame, leaves frame etc SDK没有此类发生事件,例如当一个用户被侦测到或用户丢失等等。
以下是Kinect for Windows SDK能够实现的一些特性示例:·通过骨架追踪系统识别并追踪1-2个视野范围内的活动用户;·通过能获取彩色图像数据流和深度图像数据流的XYZ-depth camera来确定物体到感应器之间的距离;·通过四元麦克风阵列捕获消除了噪声和回声的声音信息或者在捕获声音的同时确定声源位置;·通过整合了Microsoft Speech recognition API的声音捕获系统进行语音识别;应用层三大组件:NUI API:SDK的核心,用来处理彩色图像流、深度图像数据、骨骼跟踪和控制/管理Kinect设备等。
Kinect Audio DMO:提供波束成形和音源定位功能。
Windows Speech SDK:提供音频、语音、多媒体API集以及微软语音识别功能。
NUI API支持“流处理”和“设备管理”的功能,具体包括:1.Kinect传感器与计算机的连接、访问、关闭。
2.访问从Kinect传感器上传输的图像和深度数据流。
3.通过对图像和深度数据的处理来进行骨骼跟踪。
NUI API具有设备枚举的方法,可以判断已连接设备数量。
应用程序可以通过枚举来获得各个Kinect设备的名称,单独使用或设置其属性。
Kinect麦克风阵列主要API包括:DMO(DirectX Media Object,DirectX 多媒体对象)和MSAPI语音识别(Microsoft Speech Recognition API)。
应用程序使用Audio API可以:1、高质量的音频采集和以音频控制。
Kinect Audio API内嵌一系列的算法来确保接收音频品质,包括降噪、自动增益控制和回声消除等处理。
2、波束成形和程序初始化,波束定位。
Windows Speech SDK包括:Microsoft Speech API、Speech Platform SDK 和Kinect for Windows Runtime Language Pack(运行语言包)。
前言MS的kinec SDK和OpenNI都提供了人体骨骼跟踪的算法,人体骨骼跟踪算法在kinect人体行为识别中非常重要,该识别过程通常被用来作为行为识别的第一步,比如说,通过定位人体中的骨骼支架,可以提取出人手的部位,从而可以把手的部分单独拿出来分析,这样就达到了手势的定位,而后面的手势识别则可以在刚刚定位出的领域进行处理。
总而言之,一套有效的人体骨架追踪算法在kinect的一系列应用中非常有用,不过MS SDK和OpenNI虽然都提供了该算法类的直调用,但是其源码并没有开放,毕竟这是人家最核心的东东。
开发环境:QtCreator2.5.1+OpenNI1.5.4.0+Qt4.8.2实验说明在老版本的OpenNI中,要对人进行骨架追踪,需要人先摆出PSI的姿势,然后系统根据该姿势进行骨骼校正,待校正完成后才进行骨骼的跟踪,其流程图可以参考下面的图:由图可以看出,其完成骨骼跟踪主要分为3个部分,首先需检测到人体,然后需要固定的PSI姿势来对人体的姿势进行校正,待姿势校正完成后,才能进行人体骨骼的追踪。
如果程序开发者用代码实现该过程则可以参考hersey的文章透过OpenNI / NITE 分析人体骨架(上)和透过OpenNI / NITE 分析人体骨架(下),作者在这2篇文章详细介绍了老版本的人体骨架的OpenNI实现。
在新版本OpenNI1.5以后,人体骨架追踪算法更改了不少,其中最大的特点就是骨架跟踪过程中少了姿势校正的那一步骤,新版本中只需要人体站起来就可以进行跟踪了,使用起来方便很多,程序开发也简单不少。
另外人体骨骼跟踪的效果也提高了不少,一旦骨骼追踪成功后,即使人体没有保持站立姿势有时候也还是可以继续跟踪的。
新版本的人体骨骼跟踪算法使用流程图如下:下面来看看程序中的Capability,它不同于前面文章的generator:在进行骨架的判断和姿态检测是需要用到OpenNI延伸的功能,与这种延伸功能相关的类可以称作为Capability。
Windows 7 + QT + OpenNI + Kinect + OpenCV环境配置
一、配置Microsoft Visual Studio 2010
下载并且安装Microsoft Visual Studio 2010。
此处不累赘
二、配置QT环境:
◆下载并且安装QT :/downloads/
◆配置QT编译器:
此处为调式
器,不建议
参考
三、O penNi配置
下载OpenNi一键配置软件ZigFu:/
安装即可。
四、下载opencv2.4.5
下载后解压:
/project/opencvlibrary/opencv-unix/2.4.5/opencv-2.4.5.ta r.gz
右键开始菜单选择Microsoft Visual Studio 2010" -> "Visual Studio T ools" -> "Visual Studio 命令提示(2010)”
进入解压后的文件夹输入以下命令:
$ cd C:\opencv-2.4.5
$ mkdir build-msvc2010
$ cd build-msvc2012
$ cmake -G "NMakeMakefiles" -DBUILD_PERF_TESTS=OFF
-DBUILD_TESTS=OFF -DWITH_FFMPEG=OFF
-DCMAKE_BUILD_TYPE=Debug ..
$ nmake
$ nmake install
$ cmake -DCMAKE_BUILD_TYPE=Release ..
$ nmake
$ nmake install
$ nmake clean
build-msvc2010文件夹下install下的三个文件就是opecv库,加入系统环境变量。
五、配置QT
.pro文件夹下
INCLUDEPATH+=D:\msopencv\include \opencv\
D:\msopencv\include\opencv2\
D:/msopencv/include\
$$quote(C:/ProgramFiles(x86)/OpenNI/Include/)
LIBS+=D:\msopencv\lib\opencv_calib3d245.lib\
D:\msopencv\lib\opencv_contrib245.lib\
D:\msopencv\lib\opencv_core245.lib\
D:\msopencv\lib\opencv_features2d245.lib\
D:\msopencv\lib\opencv_flann245.lib\
D:\msopencv\lib\opencv_gpu245.lib\
D:\msopencv\lib\opencv_highgui245.lib\
D:\msopencv\lib\opencv_imgproc245.lib\
D:\msopencv\lib\opencv_legacy245.lib\
D:\msopencv\lib\opencv_ml245.lib\
D:\msopencv\lib\opencv_objdetect245.lib\
D:\msopencv\lib\opencv_video245.lib\
$$quote(C:\ProgramFiles(x86)\OpenNI\Lib\NiSampleExtensionModule.lib)\ $$quote(C:\ProgramFiles(x86)\OpenNI\Lib\NiSampleModule.lib)\ $$quote(C:\ProgramFiles(x86)\OpenNI\Lib\OpenNI.jni.lib)\ $$quote(C:\ProgramFiles(x86)\OpenNI\Lib\openNI.lib)\。