Kinect+OpenNI学习的笔记之7OpenNI自带地类实现手部跟踪.doc

Kinect+OpenNI学习的笔记之7OpenNI自带地类实现手部跟踪.doc

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实用标准文案 精彩文档 HYPERLINK /tornadomeet/archive/2012/10/11/2720413.html Kinect+OpenNI学习笔记之7(OpenNI自带的类实现手部跟踪) ?   前言   本文主要介绍使用OpenNI中的HandsGenerator来完成对人体手部的跟踪,在前面的文章 HYPERLINK /tornadomeet/archive/2012/10/02/2710094.html Kinect+OpenNI学习笔记之5(使用OpenNI自带的类进行简单手势识别)中已经介绍过使用GestureGenerator这个类来完成对几个简单手势的识别,这次介绍的手部跟踪是在上面简单手势识别的结果上开始跟踪的,这是OpenNI的优点,微软的SDK据说是不能单独对手部进行跟踪,因为使用MS的SDK需要检测站立人体的骨骼,然后找出节点再进行跟踪,不懂最新版本的是否支持这个功能。而此节讲的OpenNI完成手部的跟踪就不要求人必须处于站立姿势。   开发环境:QtCreator2.5.1+OpenNI+Qt4.8.2 ?   实验说明   本次实验是分为2个类来设计的。COpenNI和CKinectReader这2个类。COpenNI类负责完成Kinect的OpenNI驱动,而CKinectReader类负责将kinect读取的信息在Qt中显示出来,且使用定时器定时刷新,此过程中可以在图像中画内容。   进行手势的整体流程大概如下:      有关手势识别和跟踪的回调函数的设置在COpenNI这个类中进行,但是因为回调函数是static类型,所以对应函数里面的变量也必须是static类型,但是我们的变量初始化又放在了类中进行,而static类型的变量不能在类中进行初始化,因此最好将回调函数用到的几个static类型的变量直接放在了类外,这样虽然达到了效果,不过貌似不是一个完整的类的设计。暂时没找到好的解决方法。   从官方文档来看,OpenNI中进行手部跟踪,即采用节点hand generator来跟踪需要搭配手势检测的节点gesture generator,其代码实现流程如下:   先使用gesture generator来侦测特定的手势   当检测到特定的手势后开始进行handsgenerator的starttracking()函数来进行跟踪手部。   当hands generator开始跟踪手部位置时,HandCreate()函数被调用。   以后每当有变化的时候,都会执行HandUpdate()函数。   如果手势超出了可侦测的范围,则其回自动调用HandDestroy()函数。 ? ? ?C/c++知识点总结:   如果一个数据类型声明为auto了,那么说明该数据类型为local局部变量,一般auot关键字可以省略。   map表示的是一个键值对,其中第一个参数为键值对的类型id,这个具有唯一性,第二个是该数据类型的对应值。map的cbegin()方法表示的是返回一个常量迭代器。   array数据类型其实就是一个数组类型,定义它的时为arrayint, n表示,其长度为n,数组中的元素数据类型为int型。   static函数有点类似回调函数,一般是用来记录类对象被引用的次数或者这个函数的地址需要被外部代码调用。静态函数有2个好处,一是只能被其自己的文件使用,不能被其它的文件使用。二是其它文件可以定义相同名字的函数,不会发生冲突。   如果是在类中使用静态函数,则它是为类服务的而不是为了某一个类的具体对象服务。普通的成员函数都隐含了一个this指针,因为普通成员函数总是与具体的某个类的具体对象的。但静态成员函数由于不是与任何对象相联系,因此它不具有this指针。从这个意义上讲,它无法访问属于类对象的某个非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。   由于在本程序中,需要用到回调函数,而回调函数在类中一般需要声明成静态函数,所以在回调函数中调用类的成员变量时这些变量不能够是非静态的成员变量,编程时一定要注意。比如说在回调函数中有代码hands_generator.StartTracking(*pIDPosition);其中hands_generaotr是普通私有变量,这时编译代码时会出现如下错误提示:      另外类中的静态成员变量是属于类的,不是属于对象的,因此在定义对象的时候不能够对其进行初始化,也就是说不能够用构造函数来初始化它,如果在类外来初始化它,应该加上在变量前加上类名,而不是变量名。 ?   Qt知识点总结:   如果需要用QPainter来绘图的话,则需要将绘图部分的代码放在begin()和end()方法中,外,用QPainter 来

文档评论(0)

linlin921 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档