主要内容:
? ?
姿势探测识别 手势探测识别
一、姿势探测识别 1.1 内容介绍
NITE 2的姿势探测识别功能和人体骨骼跟踪一样,是由
UserTracker提供的,在NiTE 2.0版本中,提供了两种姿势:“POSE_PSI”(我称它为“投降姿势”)和“POSE_CROSS_HAND”(称之为“双手抱胸”),除此之外,我们没办法提供自己设定的特定姿势的探测和识别。
在之前的版本中,由于“POSE_PSI”是用来做骨架跟踪校正的标志姿势使用的,但后来NITE提供了不用校正姿势的情况下就可以进行骨架跟踪了,所以在没有特殊使用的情况下,本人(谈谈NITE 2与OpenCV结合的第二个程序(提取人体骨骼坐标))觉得在骨骼跟踪上,姿势的探测已然成为了多余的了;但对于使用姿势识别有关方面的研究的,我想这个姿势探测识别应该还是重要的,没准在NITE后面的版本中提供”自制的特定姿势“跟踪识别了。
由于在NITE中主要提供的是人体跟踪和手的跟踪,而人体姿势探测属于前者,所以姿势探测识别和人体骨骼跟踪一样,都是使用UserTracker。首先通过获得新的使用者信息;然后根据指定使用者,利用UserTracker开始进行姿势的探测;最后根据
每次探测到最新的姿势资料,进行判定识别,以及开始我们自己需要的处理工作。
1.2 代码介绍
同样的,直接上代码说明如何利用UserTracker进行姿势探
测。
#include \#include
mUserTracker.create(); while(true) { // 读取帧信息 UserTrackerFrameRef mUserFrame;
mUserTracker.readFrame( &mUserFrame); // 通过帧信息,获得用户数据UserData const Array
UserData& rUser = aUsers[i]; const UserId& uID = rUser.getId(); if( rUser.isNew() ) { cout << \ << uID << \ << endl; // 为每一个新用户进行姿势探测 cout << \ << uID<< endl; // 探测uID的两种姿势 mUserTracker.startPoseDetection( uID, POSE_PSI ); mUserTracker.startPoseDetection( uID,
POSE_CROSSED_HANDS ); } else if( rUser.isLost() ) { cout << \ << uID << \ << endl; } else { // 读取用户的“POSI_PSI”的姿势状态 const PoseData& rPosePSI = rUser.getPose( POSE_PSI ); // 当
做了“POSI_PSI”时: if( rPosePSI.isEntered() ) cout << \开始---投降姿势(PSI pose)\ << endl;
if( rPosePSI.isHeld() ) cout << \保持---投降姿势(PSI
pose)\ << endl; // 当做完了“POSI_PSI”后,双手放下时: if( rPosePSI.isExited() ) cout << \停止---投降姿势(PSI pose)\ << endl; // 同样的读取“POSE_CROSSED_HANDS”的姿势状态 const PoseData& rPCH =
rUser.getPose( POSE_CROSSED_HANDS ); if( rPCH.isEntered() ) cout << \开始---双手抱胸(Cross Hand pose)\ << endl; if( rPCH.isHeld() ) cout << \保持---双手抱胸(Cross Hand pose)\ << endl; if( rPCH.isExited() ) cout << \停止---双手抱胸(Cross Hand pose)\ <<
endl; } } } // 关闭UserTracker跟踪 mUserTracker.destroy(); // 关闭NITE环境 NiTE::shutdown(); return 0;}
上图:
当开始姿势探测时,只要双手举起,PSI就会触发,使
rPosePSI.isEntered()值为true;当保持着这个姿势一段时间,就会使rPosePSI.isHeld()值为true,表示目前的状态为保持着投降姿势;当双手放下时,rPosePSI.isExited()值为true,表示不再保持着投降姿势。同样的道理,当你做出”双手抱胸“的姿势(POSE_CROSSED_HANDS)时,也同样提供isEntered()、
isHeld()和isExited()三个函数来表示当前探测的姿势的状态情况。
注:当我无论如何做出”双手抱胸“的姿势
(POSE_CROSSED_HANDS)时,都无法触发这一姿势的跟踪,所以我的结论是我还不知道怎么去”双手抱胸“~~~
1.3 总结
? ? ?
对于姿势探测识别,主要包括以下几个步骤: 初始化NiTE环境:NiTE::initialize();
创建UserTracker跟踪器:UserTracker::create(); 读取跟踪器帧信息:
UserTracker::readFrame( &UserTrackerFrameRef);
?
通过帧信息,获得用户数据UserData:mUserFrame::getUsers();
?
对特定用户开始姿势探测(包括”投降姿势“和”双手抱胸姿势“的探测):UserTracker::startPoseDetection(UserId user, PoseType type);
?
读取用户的指定姿势的状态信息:PoseData& getPose(PoseType type);
?
主要有isEntered()、isHeld()、isExited()三个函数来表示当前探测的姿势的状态情况;
? ?
停止UserTracker跟踪器:UserTracker::destroy(); 最后停止NiTE环境:NiTE::shutdown();