19,466
社区成员
发帖
与我相关
我的任务
分享#include <stdlib.h>
#include <iostream>
#include <vector>
#include <XnCppWrapper.h>
using namespace std;
// callback function of user generator: new user
void XN_CALLBACK_TYPE NewUser( xn::UserGenerator& generator,
XnUserID user,
void* pCookie )
{
cout << "New user identified: " << user << endl;
generator.GetSkeletonCap().RequestCalibration( user, true );
}
// callback function of skeleton: calibration end
void XN_CALLBACK_TYPE CalibrationEnd( xn::SkeletonCapability& skeleton,
XnUserID user,
XnCalibrationStatus eStatus,
void* pCookie )
{
cout << "Calibration complete for user " << user << ", ";
if( eStatus == XN_CALIBRATION_STATUS_OK )
{
cout << "Success" << endl;
skeleton.StartTracking( user );
}
else
{
cout << "Failure" << endl;
skeleton.RequestCalibration( user, true );
}
}
int main( int argc, char** argv )
{
// 1. initial context
xn::Context mContext;
mContext.Init();
// 2. create user generator
xn::UserGenerator mUserGenerator;
mUserGenerator.Create( mContext );
// 3. Register callback functions of user generator
XnCallbackHandle hUserCB;
mUserGenerator.RegisterUserCallbacks( NewUser, NULL, NULL, hUserCB );
// 4. Register callback functions of skeleton capability
xn::SkeletonCapability mSC = mUserGenerator.GetSkeletonCap();
mSC.SetSkeletonProfile( XN_SKEL_PROFILE_ALL );
XnCallbackHandle hCalibCB;
mSC.RegisterToCalibrationComplete( CalibrationEnd, &mUserGenerator, hCalibCB );
// 5. start generate data
mContext.StartGeneratingAll();
while( true )
{
// 6. Update date
mContext.WaitAndUpdateAll();
// 7. get user information
XnUInt16 nUsers = mUserGenerator.GetNumberOfUsers();
if( nUsers > 0 )
{
// 8. get users
XnUserID* aUserID = new XnUserID[nUsers];
mUserGenerator.GetUsers( aUserID, nUsers );
// 9. check each user
for( int i = 0; i < nUsers; ++i )
{
// 10. if is tracking skeleton
if( mSC.IsTracking( aUserID[i] ) )
{
// 11. get skeleton joint data
XnSkeletonJointTransformation mJointTran;
mSC.GetSkeletonJoint( aUserID[i], XN_SKEL_HEAD, mJointTran );
// 12. output information
cout << "The head of user " << aUserID[i] << " is at (";
cout << mJointTran.position.position.X << ", ";
cout << mJointTran.position.position.Y << ", ";
cout << mJointTran.position.position.Z << ")" << endl;
}
}
delete [] aUserID;
}
}
// 13. stop and shutdown
mContext.StopGeneratingAll();
mContext.Release();
return 0;
}
在上面的程序代码中,NewUser() 这个就是在侦测到有新的使用者时,会被执行的 callback function;而内容呢,就是直接去呼叫 xn::SkeletonCapability 的 RequestCalibration() 函式、要求他对于侦测到的新使用者(user)进行骨架的校正。