kinect读取人体骨骼点数据

来源:互联网 发布:淘宝网付费推广有哪些 编辑:程序博客网 时间:2024/04/29 12:30

上一篇博文中实现了通过kinect读取深度图像以及彩色图像,今天使用kinect获取了人体的骨骼点数据,但读取骨骼点数据的程序运行需要的时间比获取深度图像要久,起初以为是代码出了问题,但等待较长一段时间后发现程序是好的,而且需要站在一米多的地方能够清晰的读取人体的骨骼点数据,实时性也还可以,主要参考如下这篇博主的博文:http://blog.csdn.net/zouxy09/article/details/8161617。


#include <windows.h>  #include <iostream>   #include <NuiApi.h>  #include <opencv2/opencv.hpp>    using namespace std;  using namespace cv;    //通过传入关节点的位置,把骨骼画出来  void drawSkeleton(Mat &image, CvPoint pointSet[], int whichone);    int main(int argc, char *argv[])  {      Mat skeletonImage;      skeletonImage.create(240, 320, CV_8UC3);      CvPoint skeletonPoint[NUI_SKELETON_COUNT][NUI_SKELETON_POSITION_COUNT]={cvPoint(0,0)};      bool tracked[NUI_SKELETON_COUNT]={FALSE};          //1、初始化NUI,注意这里是USES_SKELETON      HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_SKELETON);       if (FAILED(hr))       {           cout<<"NuiInitialize failed"<<endl;           return hr;       }         //2、定义骨骼信号事件句柄       HANDLE skeletonEvent = CreateEvent( NULL, TRUE, FALSE, NULL );         //3、打开骨骼跟踪事件      hr = NuiSkeletonTrackingEnable( skeletonEvent, 0 );       if( FAILED( hr ) )        {           cout<<"Could not open color image stream video"<<endl;           NuiShutdown();           return hr;       }      namedWindow("skeletonImage", CV_WINDOW_AUTOSIZE);         //4、开始读取骨骼跟踪数据       while(1)       {           NUI_SKELETON_FRAME skeletonFrame = {0};  //骨骼帧的定义           bool bFoundSkeleton = false;             //4.1、无限等待新的数据,等到后返回          if (WaitForSingleObject(skeletonEvent, INFINITE)==0)           {               //4.2、从刚才打开数据流的流句柄中得到该帧数据,读取到的数据地址存于skeletonFrame              hr = NuiSkeletonGetNextFrame( 0, &skeletonFrame);               if (SUCCEEDED(hr))              {                  //NUI_SKELETON_COUNT是检测到的骨骼数(即,跟踪到的人数)                  for( int i = 0 ; i < NUI_SKELETON_COUNT ; i++ )                   {                       NUI_SKELETON_TRACKING_STATE trackingState = skeletonFrame.SkeletonData[i].eTrackingState;                      //4.3、Kinect最多检测六个人,但只能跟踪两个人的骨骼,再检查每个“人”(有可能是空,不是人)                      //是否跟踪到了                       if( trackingState == NUI_SKELETON_TRACKED )                      {                           bFoundSkeleton = true;                       }                   }               }                 if( !bFoundSkeleton )               {                   continue;               }                 //4.4、平滑骨骼帧,消除抖动              NuiTransformSmooth(&skeletonFrame, NULL);              skeletonImage.setTo(0);                            for( int i = 0 ; i < NUI_SKELETON_COUNT ; i++ )                     {                         // Show skeleton only if it is tracked, and the center-shoulder joint is at least inferred.                       //断定是否是一个正确骨骼的条件:骨骼被跟踪到并且肩部中心(颈部位置)必须跟踪到。                       if( skeletonFrame.SkeletonData[i].eTrackingState == NUI_SKELETON_TRACKED &&                             skeletonFrame.SkeletonData[i].eSkeletonPositionTrackingState[NUI_SKELETON_POSITION_SHOULDER_CENTER] != NUI_SKELETON_POSITION_NOT_TRACKED)                         {                             float fx, fy;                             //拿到所有跟踪到的关节点的坐标,并转换为我们的深度空间的坐标,因为我们是在深度图像中                          //把这些关节点标记出来的                          //NUI_SKELETON_POSITION_COUNT为跟踪到的一个骨骼的关节点的数目,为20                          for (int j = 0; j < NUI_SKELETON_POSITION_COUNT; j++)                             {                                 NuiTransformSkeletonToDepthImage(skeletonFrame.SkeletonData[i].SkeletonPositions[j], &fx, &fy );                                 skeletonPoint[i][j].x = (int)fx;                                 skeletonPoint[i][j].y = (int)fy;                             }                                            for (int j=0; j<NUI_SKELETON_POSITION_COUNT ; j++)                             {                                 if (skeletonFrame.SkeletonData[i].eSkeletonPositionTrackingState[j] != NUI_SKELETON_POSITION_NOT_TRACKED)//跟踪点一用有三种状态:1没有被跟踪到,2跟踪到,3根据跟踪到的估计到                                 {                                                                     circle(skeletonImage, skeletonPoint[i][j], 3, cvScalar(0, 255, 255), 1, 8, 0);                                             tracked[i] = TRUE;                               }                           }                                           drawSkeleton(skeletonImage, skeletonPoint[i], i);                       }                   }              imshow("skeletonImage", skeletonImage); //显示图像           }           else           {               cout<<"Buffer length of received texture is bogus\r\n"<<endl;           }            if (cvWaitKey(20) == 27)               break;       }       //5、关闭NUI链接       NuiShutdown();       return 0;  }    //通过传入关节点的位置,把骨骼画出来  void drawSkeleton(Mat &image, CvPoint pointSet[], int whichone)   {       CvScalar color;       switch(whichone) //跟踪不同的人显示不同的颜色       {       case 0:           color = cvScalar(255);           break;       case 1:           color = cvScalar(0,255);           break;       case 2:           color = cvScalar(0, 0, 255);           break;       case 3:           color = cvScalar(255, 255, 0);           break;       case 4:           color = cvScalar(255, 0, 255);           break;       case 5:           color = cvScalar(0, 255, 255);           break;       }          if((pointSet[NUI_SKELETON_POSITION_HEAD].x!=0 || pointSet[NUI_SKELETON_POSITION_HEAD].y!=0) &&           (pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER].x!=0 || pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER].y!=0))           line(image, pointSet[NUI_SKELETON_POSITION_HEAD], pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER], color, 2);       if((pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER].x!=0 || pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER].y!=0) &&           (pointSet[NUI_SKELETON_POSITION_SPINE].x!=0 || pointSet[NUI_SKELETON_POSITION_SPINE].y!=0))           line(image, pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER], pointSet[NUI_SKELETON_POSITION_SPINE], color, 2);       if((pointSet[NUI_SKELETON_POSITION_SPINE].x!=0 || pointSet[NUI_SKELETON_POSITION_SPINE].y!=0) &&           (pointSet[NUI_SKELETON_POSITION_HIP_CENTER].x!=0 || pointSet[NUI_SKELETON_POSITION_HIP_CENTER].y!=0))           line(image, pointSet[NUI_SKELETON_POSITION_SPINE], pointSet[NUI_SKELETON_POSITION_HIP_CENTER], color, 2);          //左上肢       if((pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER].x!=0 || pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER].y!=0) &&           (pointSet[NUI_SKELETON_POSITION_SHOULDER_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_SHOULDER_LEFT].y!=0))           line(image, pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER], pointSet[NUI_SKELETON_POSITION_SHOULDER_LEFT], color, 2);       if((pointSet[NUI_SKELETON_POSITION_SHOULDER_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_SHOULDER_LEFT].y!=0) &&           (pointSet[NUI_SKELETON_POSITION_ELBOW_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_ELBOW_LEFT].y!=0))           line(image, pointSet[NUI_SKELETON_POSITION_SHOULDER_LEFT], pointSet[NUI_SKELETON_POSITION_ELBOW_LEFT], color, 2);       if((pointSet[NUI_SKELETON_POSITION_ELBOW_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_ELBOW_LEFT].y!=0) &&           (pointSet[NUI_SKELETON_POSITION_WRIST_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_WRIST_LEFT].y!=0))           line(image, pointSet[NUI_SKELETON_POSITION_ELBOW_LEFT], pointSet[NUI_SKELETON_POSITION_WRIST_LEFT], color, 2);       if((pointSet[NUI_SKELETON_POSITION_WRIST_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_WRIST_LEFT].y!=0) &&           (pointSet[NUI_SKELETON_POSITION_HAND_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_HAND_LEFT].y!=0))           line(image, pointSet[NUI_SKELETON_POSITION_WRIST_LEFT], pointSet[NUI_SKELETON_POSITION_HAND_LEFT], color, 2);          //右上肢       if((pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER].x!=0 || pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER].y!=0) &&           (pointSet[NUI_SKELETON_POSITION_SHOULDER_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_SHOULDER_RIGHT].y!=0))           line(image, pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER], pointSet[NUI_SKELETON_POSITION_SHOULDER_RIGHT], color, 2);       if((pointSet[NUI_SKELETON_POSITION_SHOULDER_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_SHOULDER_RIGHT].y!=0) &&           (pointSet[NUI_SKELETON_POSITION_ELBOW_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_ELBOW_RIGHT].y!=0))           line(image, pointSet[NUI_SKELETON_POSITION_SHOULDER_RIGHT], pointSet[NUI_SKELETON_POSITION_ELBOW_RIGHT], color, 2);       if((pointSet[NUI_SKELETON_POSITION_ELBOW_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_ELBOW_RIGHT].y!=0) &&           (pointSet[NUI_SKELETON_POSITION_WRIST_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_WRIST_RIGHT].y!=0))           line(image, pointSet[NUI_SKELETON_POSITION_ELBOW_RIGHT], pointSet[NUI_SKELETON_POSITION_WRIST_RIGHT], color, 2);       if((pointSet[NUI_SKELETON_POSITION_WRIST_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_WRIST_RIGHT].y!=0) &&           (pointSet[NUI_SKELETON_POSITION_HAND_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_HAND_RIGHT].y!=0))           line(image, pointSet[NUI_SKELETON_POSITION_WRIST_RIGHT], pointSet[NUI_SKELETON_POSITION_HAND_RIGHT], color, 2);          //左下肢       if((pointSet[NUI_SKELETON_POSITION_HIP_CENTER].x!=0 || pointSet[NUI_SKELETON_POSITION_HIP_CENTER].y!=0) &&           (pointSet[NUI_SKELETON_POSITION_HIP_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_HIP_LEFT].y!=0))           line(image, pointSet[NUI_SKELETON_POSITION_HIP_CENTER], pointSet[NUI_SKELETON_POSITION_HIP_LEFT], color, 2);       if((pointSet[NUI_SKELETON_POSITION_HIP_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_HIP_LEFT].y!=0) &&           (pointSet[NUI_SKELETON_POSITION_KNEE_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_KNEE_LEFT].y!=0))           line(image, pointSet[NUI_SKELETON_POSITION_HIP_LEFT], pointSet[NUI_SKELETON_POSITION_KNEE_LEFT], color, 2);       if((pointSet[NUI_SKELETON_POSITION_KNEE_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_KNEE_LEFT].y!=0) &&           (pointSet[NUI_SKELETON_POSITION_ANKLE_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_ANKLE_LEFT].y!=0))           line(image, pointSet[NUI_SKELETON_POSITION_KNEE_LEFT], pointSet[NUI_SKELETON_POSITION_ANKLE_LEFT], color, 2);       if((pointSet[NUI_SKELETON_POSITION_ANKLE_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_ANKLE_LEFT].y!=0) &&            (pointSet[NUI_SKELETON_POSITION_FOOT_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_FOOT_LEFT].y!=0))           line(image, pointSet[NUI_SKELETON_POSITION_ANKLE_LEFT], pointSet[NUI_SKELETON_POSITION_FOOT_LEFT], color, 2);          //右下肢       if((pointSet[NUI_SKELETON_POSITION_HIP_CENTER].x!=0 || pointSet[NUI_SKELETON_POSITION_HIP_CENTER].y!=0) &&           (pointSet[NUI_SKELETON_POSITION_HIP_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_HIP_RIGHT].y!=0))           line(image, pointSet[NUI_SKELETON_POSITION_HIP_CENTER], pointSet[NUI_SKELETON_POSITION_HIP_RIGHT], color, 2);       if((pointSet[NUI_SKELETON_POSITION_HIP_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_HIP_RIGHT].y!=0) &&           (pointSet[NUI_SKELETON_POSITION_KNEE_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_KNEE_RIGHT].y!=0))           line(image, pointSet[NUI_SKELETON_POSITION_HIP_RIGHT], pointSet[NUI_SKELETON_POSITION_KNEE_RIGHT],color, 2);       if((pointSet[NUI_SKELETON_POSITION_KNEE_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_KNEE_RIGHT].y!=0) &&           (pointSet[NUI_SKELETON_POSITION_ANKLE_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_ANKLE_RIGHT].y!=0))           line(image, pointSet[NUI_SKELETON_POSITION_KNEE_RIGHT], pointSet[NUI_SKELETON_POSITION_ANKLE_RIGHT], color, 2);       if((pointSet[NUI_SKELETON_POSITION_ANKLE_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_ANKLE_RIGHT].y!=0) &&           (pointSet[NUI_SKELETON_POSITION_FOOT_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_FOOT_RIGHT].y!=0))           line(image, pointSet[NUI_SKELETON_POSITION_ANKLE_RIGHT], pointSet[NUI_SKELETON_POSITION_FOOT_RIGHT], color, 2);   }  


原创粉丝点击