前言
因为 OpenNI 可以获取到 kinect 的深度信息,而深度信息在手势识别中有很大用处,因此
本文就来使用 OpenNI 自带的类来做简单的手势识别。识别的动作为 4 种,挥手,手移动,举
手,往前推手。通过后面的实验可以发现,其实提供的类的效果非常不好。
开发环境:QtCreator2.5.1+OpenNI1.5.4.0+Qt4.8.2+OpenCV2.4.2
实验说明
跟手势相关的是 GestureGenerator 这个类,它的初始化过程和 depth_metadata,
image_metadata 都一样,因此首先在上 2 篇文章的 COpenNI 类中增加一个 public 类对象
GestureGenerator gesture_generator;为什么不放在 private 里呢?因为我们的 COpenNI
对象需要调用这个变量来设置手势获取的一些属性,比如手势识别的种类等,总之就是这个变量
外部需要能够访问得到,因此这里我将其放在 public 里面。另外在 COpenNI 类的 Init()函数
中需要加入下面的代码:
status = gesture_generator.Create(context);
if(CheckError("Create gesture generator error!")) {
return false;
}
/*添加手势识别的种类*/
gesture_generator.AddGesture("Wave", NULL);
gesture_generator.AddGesture("click", NULL);
gesture_generator.AddGesture("RaiseHand", NULL);
gesture_generator.AddGesture("MovingHand", NULL);
OpenNI 进行手势识别的方式是采用函数回调,即如果一个手势发生了或者正在发生时可
以触发相应的回调函数,从而去执行回调函数,这有点类似于 Qt 中的信号与槽的关系。在
OpenNI 中设置回调函数的原型为:
XnStatus RegisterGestureCallbacks(GestureRecognized RecognizedCB,
GestureProgress ProgressCB, void* pCookie, XnCallbackHandle& hCallback);
其中前 2 个参数为回调函数,第一个回调函数表示手部某个动作已经执行完毕,第二个参
数表示收部某个动作正在执行;参数三为一个空指针,即可以指向任何数据类型的指针,其作用
- 1
- 2
- 3
- 4
前往页