欢迎来到天天文库
浏览记录
ID:28871352
大小:475.00 KB
页数:14页
时间:2018-12-14
《kinect+openni学习的笔记之7openni自带地类实现手部跟踪》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实用标准文案Kinect+OpenNI学习笔记之7(OpenNI自带的类实现手部跟踪) 前言 本文主要介绍使用OpenNI中的HandsGenerator来完成对人体手部的跟踪,在前面的文章Kinect+OpenNI学习笔记之5(使用OpenNI自带的类进行简单手势识别)中已经介绍过使用GestureGenerator这个类来完成对几个简单手势的识别,这次介绍的手部跟踪是在上面简单手势识别的结果上开始跟踪的,这是OpenNI的优点,微软的SDK据说是不能单独对手部进行跟踪,因为使用MS的SDK需要检测站立人体的骨骼,然后找出节点再进行跟踪,不懂最新版
2、本的是否支持这个功能。而此节讲的OpenNI完成手部的跟踪就不要求人必须处于站立姿势。 开发环境:QtCreator2.5.1+OpenNI1.5.4.0+Qt4.8.2 实验说明 本次实验是分为2个类来设计的。COpenNI和CKinectReader这2个类。COpenNI类负责完成Kinect的OpenNI驱动,而CKinectReader类负责将kinect读取的信息在Qt中显示出来,且使用定时器定时刷新,此过程中可以在图像中画内容。 进行手势的整体流程大概如下:精彩文档实用标准文案 有关手势识别和跟踪的回调函数的设置在COpenN
3、I这个类中进行,但是因为回调函数是static类型,所以对应函数里面的变量也必须是static类型,但是我们的变量初始化又放在了类中进行,而static类型的变量不能在类中进行初始化,因此最好将回调函数用到的几个static类型的变量直接放在了类外,这样虽然达到了效果,不过貌似不是一个完整的类的设计。暂时没找到好的解决方法。 从官方文档来看,OpenNI中进行手部跟踪,即采用节点handgenerator来跟踪需要搭配手势检测的节点gesturegenerator,其代码实现流程如下: 先使用gesturegenerator来侦测特定的手势 当检测到
4、特定的手势后开始进行handsgenerator的starttracking()函数来进行跟踪手部。 当handsgenerator开始跟踪手部位置时,HandCreate()函数被调用。 以后每当有变化的时候,都会执行HandUpdate()函数。 如果手势超出了可侦测的范围,则其回自动调用HandDestroy()函数。精彩文档实用标准文案 C/c++知识点总结: 如果一个数据类型声明为auto了,那么说明该数据类型为local局部变量,一般auot关键字可以省略。 map表示的是一个键值对,其中第一个参数为键值对的类型id,这个具有唯
5、一性,第二个是该数据类型的对应值。map的cbegin()方法表示的是返回一个常量迭代器。 array数据类型其实就是一个数组类型,定义它的时为array表示,其长度为n,数组中的元素数据类型为int型。 static函数有点类似回调函数,一般是用来记录类对象被引用的次数或者这个函数的地址需要被外部代码调用。静态函数有2个好处,一是只能被其自己的文件使用,不能被其它的文件使用。二是其它文件可以定义相同名字的函数,不会发生冲突。 如果是在类中使用静态函数,则它是为类服务的而不是为了某一个类的具体对象服务。普通的成员函数都隐含了一个this
6、指针,因为普通成员函数总是与具体的某个类的具体对象的。但静态成员函数由于不是与任何对象相联系,因此它不具有this指针。从这个意义上讲,它无法访问属于类对象的某个非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。 由于在本程序中,需要用到回调函数,而回调函数在类中一般需要声明成静态函数,所以在回调函数中调用类的成员变量时这些变量不能够是非静态的成员变量,编程时一定要注意。比如说在回调函数中有代码hands_generator.StartTracking(*pIDPosition);其中hands_generaotr是普通私有变量,这
7、时编译代码时会出现如下错误提示: 另外类中的静态成员变量是属于类的,不是属于对象的,因此在定义对象的时候不能够对其进行初始化,也就是说不能够用构造函数来初始化它,如果在类外来初始化它,应该加上在变量前加上类名,而不是变量名。 Qt知识点总结: 如果需要用QPainter来绘图的话,则需要将绘图部分的代码放在begin()和end()方法中,外,用QPainter来创建一个新的绘图类时,其内部已经隐含了具有begin()方法。 实验结果: 这是实验中截图的一张结果,该实验可以同时跟踪多个手部,每一个使用不同的颜色来显示其轨迹,当识别到手部后
8、,可以使用手指在空中写字。精彩文档实用标准文案 实验主要部
此文档下载收益归作者所有