Kinect+OpenNI学习的笔记之7OpenNI自带地类实现手部跟踪文档格式.docx
- 文档编号:15966238
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:16
- 大小:400.77KB
Kinect+OpenNI学习的笔记之7OpenNI自带地类实现手部跟踪文档格式.docx
《Kinect+OpenNI学习的笔记之7OpenNI自带地类实现手部跟踪文档格式.docx》由会员分享,可在线阅读,更多相关《Kinect+OpenNI学习的笔记之7OpenNI自带地类实现手部跟踪文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
有关手势识别和跟踪的回调函数的设置在COpenNI这个类中进行,但是因为回调函数是static类型,所以对应函数里面的变量也必须是static类型,但是我们的变量初始化又放在了类中进行,而static类型的变量不能在类中进行初始化,因此最好将回调函数用到的几个static类型的变量直接放在了类外,这样虽然达到了效果,不过貌似不是一个完整的类的设计。
暂时没找到好的解决方法。
从官方文档来看,OpenNI中进行手部跟踪,即采用节点handgenerator来跟踪需要搭配手势检测的节点gesturegenerator,其代码实现流程如下:
先使用gesturegenerator来侦测特定的手势
当检测到特定的手势后开始进行handsgenerator的starttracking()函数来进行跟踪手部。
当handsgenerator开始跟踪手部位置时,HandCreate()函数被调用。
以后每当有变化的时候,都会执行HandUpdate()函数。
如果手势超出了可侦测的范围,则其回自动调用HandDestroy()函数。
C/c++知识点总结:
如果一个数据类型声明为auto了,那么说明该数据类型为local局部变量,一般auot关键字可以省略。
map表示的是一个键值对,其中第一个参数为键值对的类型id,这个具有唯一性,第二个是该数据类型的对应值。
map的cbegin()方法表示的是返回一个常量迭代器。
array数据类型其实就是一个数组类型,定义它的时为array<
int,n>
表示,其长度为n,数组中的元素数据类型为int型。
static函数有点类似回调函数,一般是用来记录类对象被引用的次数或者这个函数的地址需要被外部代码调用。
静态函数有2个好处,一是只能被其自己的文件使用,不能被其它的文件使用。
二是其它文件可以定义相同名字的函数,不会发生冲突。
如果是在类中使用静态函数,则它是为类服务的而不是为了某一个类的具体对象服务。
普通的成员函数都隐含了一个this指针,因为普通成员函数总是与具体的某个类的具体对象的。
但静态成员函数由于不是与任何对象相联系,因此它不具有this指针。
从这个意义上讲,它无法访问属于类对象的某个非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。
由于在本程序中,需要用到回调函数,而回调函数在类中一般需要声明成静态函数,所以在回调函数中调用类的成员变量时这些变量不能够是非静态的成员变量,编程时一定要注意。
比如说在回调函数中有代码hands_generator.StartTracking(*pIDPosition);
其中hands_generaotr是普通私有变量,这时编译代码时会出现如下错误提示:
另外类中的静态成员变量是属于类的,不是属于对象的,因此在定义对象的时候不能够对其进行初始化,也就是说不能够用构造函数来初始化它,如果在类外来初始化它,应该加上在变量前加上类名,而不是变量名。
Qt知识点总结:
如果需要用QPainter来绘图的话,则需要将绘图部分的代码放在begin()和end()方法中,外,用QPainter来创建一个新的绘图类时,其内部已经隐含了具有begin()方法。
实验结果:
这是实验中截图的一张结果,该实验可以同时跟踪多个手部,每一个使用不同的颜色来显示其轨迹,当识别到手部后,可以使用手指在空中写字。
实验主要部分代码及注释(附录有实验工程code下载地址):
copenni.cpp:
#ifndefCOPENNI_CLASS
#defineCOPENNI_CLASS
#include<
XnCppWrapper.h>
QtGui/QtGui>
iostream>
map>
usingnamespacexn;
usingnamespacestd;
staticDepthGeneratordepth_generator;
staticHandsGeneratorhands_generator;
staticstd:
:
map<
XnUserID,vector<
XnPoint3D>
>
hands_track_points;
classCOpenNI
{
public:
~COpenNI(){
context.Release();
//释放空间
}
boolInitial(){
//初始化
status=context.Init();
if(CheckError("
Contextinitialfailed!
"
)){
returnfalse;
context.SetGlobalMirror(true);
//设置镜像
xmode.nXRes=640;
xmode.nYRes=480;
xmode.nFPS=30;
//产生颜色node
status=image_generator.Create(context);
Createimagegeneratorerror!
//设置颜色图片输出模式
status=image_generator.SetMapOutputMode(xmode);
SetMapOutputMdoeerror!
//产生深度node
status=depth_generator.Create(context);
Createdepthgeneratorerror!
//设置深度图片输出模式
status=depth_generator.SetMapOutputMode(xmode);
//产生手势node
status=gesture_generator.Create(context);
Creategesturegeneratorerror!
/*添加手势识别的种类*/
gesture_generator.AddGesture("
Wave"
NULL);
click"
RaiseHand"
MovingHand"
//产生手部的node
status=hands_generator.Create(context);
Createhandgeneraotrerror!
//产生人体node
status=user_generator.Create(context);
Creategesturengeneratorerror!
//视角校正
status=depth_generator.GetAlternativeViewPointCap().SetViewPoint(image_generator);
Can'
tsetthealternativeviewpointondepthgenerator!
//设置与手势有关的回调函数
XnCallbackHandlegesture_cb;
gesture_generator.RegisterGestureCallbacks(CBGestureRecognized,CBGestureProgress,NULL,gesture_cb);
//设置于手部有关的回调函数
XnCallbackHandlehands_cb;
hands_generator.RegisterHandCallbacks(HandCreate,HandUpdate,HandDestroy,NULL,hands_cb);
//设置有人进入视野的回调函数
XnCallbackHandlenew_user_handle;
user_generator.RegisterUserCallbacks(CBNewUser,NULL,NULL,new_user_handle);
user_generator.GetSkeletonCap().SetSkeletonProfile(XN_SKEL_PROFILE_ALL);
//设定使用所有关节(共15个)
//设置骨骼校正完成的回调函数
XnCallbackHandlecalibration_complete;
user_generator.GetSkeletonCap().RegisterToCalibrationComplete(CBCalibrationComplete,NULL,calibration_complete);
returntrue;
boolStart(){
status=context.StartGeneratingAll();
Startgeneratingerror!
boolUpdateData(){
status=context.WaitNoneUpdateAll();
Update
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Kinect OpenNI 学习 笔记 实现 跟踪