00001 
00009 #include  "OpenNi2Tool.h"
00010 #include  "tools++.h"
00011 
00012 
00013 
00014 #ifdef  ENABLE_OPENNI2
00015 
00016 
00017 using namespace jbxl;
00018 
00019 
00020 
00021 
00022 COpenNiTool::COpenNiTool(void)
00023 {
00024     device        = NULL;
00025     dev_backup    = NULL; 
00026 
00027     tracking_user = 0;
00028     tracking_deny = 0;
00029 
00030     m_err_mesg    = make_Buffer(LMESG);
00031 
00032     clear_JointsData();
00033 }
00034 
00035 
00036 
00037 BOOL  COpenNiTool::init(BOOL use_image)
00038 {
00039     device = new COpenNi2Device();
00040     BOOL ret = device->init(use_image);
00041     if (ret) {
00042         
00043         setGlobalMirror(TRUE);
00044     }
00045     else {
00046         copy_Buffer(&device->m_err_mesg, &m_err_mesg);
00047     }
00048 
00049     
00050     device->m_state = NI_STATE_DETECT_STOPPED;
00051 
00052     return ret;
00053 }
00054 
00055 
00056 
00057 void  COpenNiTool::free(void)
00058 {
00059     delete_Device();
00060 
00061     free_Buffer(&m_err_mesg);
00062 }
00063 
00064 
00065 
00066 void  COpenNiTool::delete_Device(void)
00067 {
00068     if (device!=NULL) {
00069         delete(device);
00070         device = NULL;
00071     }
00072     return;
00073 }
00074 
00075 
00076 
00077 void  COpenNiTool::clear_JointsData(void)
00078 {
00079     clear_JointsPosData();
00080     clear_JointsRotData();
00081 }
00082 
00083 
00084 
00085 void  COpenNiTool::clear_JointsPosData(void)
00086 {
00087     memset(jointPosData, 0, sizeof(XnVector3D) *OPENNI_JOINT_NUM);
00088     memset(jointPosConfidence, 0, sizeof(double)*OPENNI_JOINT_NUM);
00089 }
00090 
00091 
00092 
00093 void  COpenNiTool::clear_JointsRotData(void)
00094 {
00095     memset(jointRotData, 0, sizeof(XnMatrix3X3)*OPENNI_JOINT_NUM);
00096     memset(jointRotConfidence, 0, sizeof(double)*OPENNI_JOINT_NUM);
00097 }
00098 
00099 
00100 
00101 nite::UserData* COpenNiTool::get_Avatar(unsigned int id)
00102 {
00103     static nite::UserData avatar;
00104 
00105     if (device!=NULL && device->user!=NULL) {
00106         const nite::Array<nite::UserData>& avatars = device->userFrame.getUsers();
00107         for (int i=0; i<avatars.getSize(); i++) {
00108             avatar = avatars[i];
00109             if (id==(unsigned int)avatar.getId()) {
00110                 return &avatar;
00111                 break;
00112             }
00113         }
00114     }
00115 
00116     return NULL;
00117 }
00118     
00119 
00120 
00121 
00123 
00124 
00125 void  COpenNiTool::get_JointsPositionData(unsigned int nId)
00126 {
00127     nite::UserData* avatar = get_Avatar(nId);
00128     if (avatar==NULL) {
00129         clear_JointsPosData();
00130         return;
00131     }
00132 
00133     const nite::Skeleton& skeelton = avatar->getSkeleton();
00134 
00135     if (skeelton.getState()==nite::SKELETON_TRACKED) {
00136         for (int j=1; j<OPENNI_JOINT_NUM; j++) {
00137             const nite::SkeletonJoint& joint = skeelton.getJoint((nite::JointType)(j-1));
00138             const nite::Point3f& position = joint.getPosition();
00139             jointPosData[j].X = position.x;
00140             jointPosData[j].Y = position.y;
00141             jointPosData[j].Z = position.z;
00142             jointPosConfidence[j] = joint.getPositionConfidence();
00143         }
00144     }
00145 }
00146 
00147 
00148 
00149 void  COpenNiTool::get_JointsRotationData(unsigned int nId)
00150 {
00151     memset(jointRotData, 0, sizeof(XnMatrix3X3)*OPENNI_JOINT_NUM);
00152     memset(jointRotConfidence, 0, sizeof(double)*OPENNI_JOINT_NUM);
00153 
00154     
00155 
00156 
00157 
00158 
00159 
00160 
00161 
00162 
00163 
00164 
00165 
00166 }
00167 
00168 
00169 
00170 XnVector3D   COpenNiTool::joint_PositionData(int j)
00171 { 
00172     XnVector3D vect;
00173 
00174     if (j>=0 && j<OPENNI_JOINT_NUM) {
00175         vect = jointPosData[j];
00176     }
00177     else {
00178         memset(&vect, 0, sizeof(XnVector3D));
00179     }
00180 
00181     return vect;
00182 }
00183 
00184 
00185 
00186 XnMatrix3X3  COpenNiTool::joint_RotationData(int j)
00187 {
00188     XnMatrix3X3 mtrx;
00189 
00190     if (j>=0 && j<OPENNI_JOINT_NUM) {
00191         mtrx = jointRotData[j];
00192     }
00193     else {
00194         memset(&mtrx, 0, sizeof(XnMatrix3X3));
00195     }
00196 
00197     return mtrx;
00198 }
00199 
00200 
00201 
00202 double  COpenNiTool::joint_PositionConfidence(int j)
00203 { 
00204     double cnfd = 0.0;
00205 
00206     if (j>=0 && j<OPENNI_JOINT_NUM) {
00207         cnfd = (double)jointPosConfidence[j];
00208     }
00209 
00210     return cnfd;
00211 }
00212 
00213 
00214 
00215 
00216 double  COpenNiTool::joint_RotationConfidence(int j)
00217 { 
00218     double cnfd = 0.0;
00219 
00220     if (j>=0 && j<OPENNI_JOINT_NUM) {
00221         cnfd = (double)jointRotConfidence[j];
00222     }
00223 
00224     return cnfd;
00225 }
00226 
00227 
00228 
00229 
00231 
00232 
00233 BOOL  COpenNiTool::start_Detection(int profile, double smooth)
00234 {
00235     if (device->m_state==NI_STATE_DETECT_EXEC) {
00236         copy_s2Buffer("COpenNiTool:start_Detection WARNING: detection is already executed", &m_err_mesg);
00237         return FALSE;
00238     }
00239 
00240     device->m_state = NI_STATE_DETECT_STARTING;
00241     clear_JointsData();
00242     tracking_user = 0;
00243     tracking_deny = 0;
00244 
00245     BOOL     ret = device->create_User();
00246     if (ret) ret = device->setup_Tracking(profile, smooth);
00247 
00248     if (!ret) {
00249         device->m_state = NI_STATE_DETECT_STOPPING;
00250         device->delete_User();
00251         device->m_state = NI_STATE_DETECT_STOPPED;
00252         copy_s2Buffer("COpenNiTool:start_Detection ERROR: Myabe NITE is not installed!!", &m_err_mesg);
00253         return FALSE;
00254     }
00255     device->m_state = NI_STATE_DETECT_EXEC;
00256 
00257     return TRUE;
00258 }
00259 
00260 
00261 
00262 BOOL  COpenNiTool::stop_Detection(void)
00263 {
00264     if (device->m_state==NI_STATE_DETECT_STOPPED) {
00265         copy_s2Buffer("COpenNiTool:stop_Detection WARNING: detection is already stopped", &m_err_mesg);
00266         return FALSE;
00267     }
00268 
00269     device->m_state = NI_STATE_DETECT_STOPPING;
00270     Sleep(NI_STOP_WAIT_TIME);
00271     device->delete_User();
00272 
00273     tracking_user = 0;
00274     tracking_deny = 0;
00275 
00276     device->m_state = NI_STATE_DETECT_STOPPED;
00277     
00278     return TRUE;
00279 }
00280 
00281 
00282 
00283 unsigned int  COpenNiTool::get_TrackingUser(void)
00284 {
00285     unsigned int id = 0;
00286 
00287     if (device!=NULL && device->user!=NULL) {
00288         const nite::Array<nite::UserData>& avatars = device->userFrame.getUsers();
00289             
00290         int start = 0;
00291         if (tracking_deny!=0) {
00292             for (int i=0; i<avatars.getSize(); i++) {
00293                 const nite::UserData& avatar = avatars[i];
00294                 if (tracking_deny==(unsigned int)avatar.getId()) {
00295                     start = i + 1;
00296                     break;
00297                 }
00298             }
00299         }
00300         
00301         for (int i=0; i<avatars.getSize(); i++) {
00302             int idx = (start + i) % avatars.getSize();
00303             const nite::UserData& avatar = avatars[idx];
00304             if (avatar.isNew()) {
00305                 nite::Status nc = device->user->startSkeletonTracking(avatar.getId());
00306                 if (nc==nite::STATUS_OK) id = (unsigned int)avatar.getId();
00307                 break;
00308             }
00309             else if (!avatar.isLost()) {
00310                 id = (unsigned int)avatar.getId();
00311                 break;
00312             }
00313         }
00314     }
00315 
00316     return id;
00317 }
00318 
00319 
00320 
00321 void  COpenNiTool::set_DenyTrackingSearch(unsigned int user)
00322 {
00323     if ((int)user>0) tracking_deny = user;
00324     else             tracking_deny = 0;
00325 
00326     return;
00327 }
00328 
00329 
00330 
00331 
00333 
00334 BOOL  COpenNiTool::backupDevice(void)
00335 {
00336     dev_backup = device;
00337     device = new COpenNi2Device();
00338     
00339     if (device==NULL) {
00340         device = dev_backup;
00341         dev_backup = NULL;
00342         return FALSE;
00343     }
00344     return TRUE;
00345 }
00346 
00347 
00348 
00349 BOOL  COpenNiTool::restoreDevice(void)
00350 {
00351     if (dev_backup==NULL) return FALSE;
00352     
00353     delete(device);
00354     device = dev_backup;
00355     dev_backup = NULL;
00356     return TRUE;
00357 }
00358 
00359 
00360 #endif      // ifdef ENABLE_OPENNI2