Kinect V2 开发专题(4)骨骼/深度/红外/摄像头数据获取

【原文:http://blog.csdn.net/bbdxf/article/details/44857099

Kinect V2 开发专题(4)

1、骨骼数据获取

2、深度数据获取

3、红外图像获取

4、摄像头数据获取

1、骨骼数据获取

前面的代码省略,从获取数据开始:

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. // 获取身体数据  
  2.     IBodyFrameSource* bodys = nullptr;  
  3.     bb->get_BodyFrameSource(&bodys); // Body 数据源  
  4.     INT32 nBodyNum = 0;  
  5.     bodys->get_BodyCount(&nBodyNum); // 获取body 个数,没用,一直是6  
  6.     printf("Body Num: %d\n", nBodyNum);  
  7.     IBodyFrameReader* bodyr = nullptr;  
  8.     bodys->OpenReader(&bodyr); // 准备读取body数据  
  9.   
  10.     while (true)  
  11.     {  
  12.         IBodyFrame* bodyf = nullptr;  
  13.         bodyr->AcquireLatestFrame(&bodyf); // 获取最近的一帧数据  
  14.         if ( !bodyf )  
  15.         {  
  16.             Sleep(100);  
  17.             printf(".");  
  18.             continue;  
  19.         }  
  20.         IBody* ppBodies[BODY_COUNT] = { 0 };  
  21.         bodyf->GetAndRefreshBodyData(BODY_COUNT, ppBodies); // 更新所有人身体数据  
  22.         for (int i = 0; i < BODY_COUNT; ++i)  
  23.         {  
  24.             IBody* pBody = ppBodies[i]; // 轮询每个人的信息  
  25.             if (pBody)  
  26.             {  
  27.                 BOOLEAN bTracked = false;  
  28.                 hr = pBody->get_IsTracked(&bTracked); // 检测是否被跟踪,即是否有这个人  
  29.                 if (bTracked)  
  30.                 {  
  31.                     Joint joints[JointType_Count];  
  32.                     HandState leftHandState = HandState_Unknown;  
  33.                     HandState rightHandState = HandState_Unknown;  
  34.                     pBody->get_HandLeftState(&leftHandState); // 获取左手的状态  
  35.                     pBody->get_HandRightState(&rightHandState); // 获取右手的状态  
  36.   
  37.                     hr = pBody->GetJoints(_countof(joints), joints); // 获取身体的骨骼信息,25点  
  38.                     printf("Person %d : Joints[0].Z  %.2f\n", i, joints[0].Position.Z); //简单的输出他的信息  
  39.   
  40.                 }  
  41.             }  
  42.         }  
  43.         for (int i = 0; i < BODY_COUNT; ++i)  
  44.         {  
  45.             ppBodies[i]->Release();  
  46.         }  
  47.         bodyf->Release();  
  48.     }  

2、深度数据获取

有了骨骼信息,深度数据就显得没太大的用处了。

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. /* 
  2. Depth min: 500  max: 4500 
  3. Frame: 424  512 
  4. Buffer size: 217088 
  5. */  
  6. int _tmain(int argc, _TCHAR* argv[])  
  7. {  
  8.     printf("Hello, Wellcome to kinect world!\n");  
  9.     IKinectSensor* pKinect = nullptr;  
  10.     GetDefaultKinectSensor(&pKinect);  
  11.     if ( !pKinect)  
  12.     {  
  13.         printf("Get Kinect failed!\n");  
  14.         goto endstop;  
  15.     }  
  16.     pKinect->Open();  
  17.     BOOLEAN bOpen = false;  
  18.     // 一直等待直到Kinect打开完成  
  19.     while (!bOpen)  
  20.     {  
  21.         pKinect->get_IsOpen(&bOpen);  
  22.         Sleep(200);  
  23.     }  
  24.     IDepthFrameSource* depths = nullptr;  
  25.     pKinect->get_DepthFrameSource(&depths); // 获取深度数据源  
  26.     IDepthFrameReader* depthr = nullptr;  
  27.     depths->OpenReader(&depthr); // 打开深度解析器  
  28.     while (true)  
  29.     {  
  30.         IDepthFrame* depthf = nullptr;  
  31.         depthr->AcquireLatestFrame(&depthf); // 获取最近的深度数据  
  32.         if ( !depthf )  
  33.         {  
  34.             Sleep(200);  
  35.             continue;  
  36.         }  
  37.         USHORT minds, maxds;  
  38.         depthf->get_DepthMinReliableDistance(&minds); // 获取最近的有效距离,500  
  39.         depthf->get_DepthMaxReliableDistance(&maxds); // 获取最远的有效距离,4500  
  40.         printf("Depth min: %d  max: %d\n", minds, maxds);  
  41.         IFrameDescription* frameDs = nullptr;  
  42.         depthf->get_FrameDescription(&frameDs); // 获取深度信息的属性  
  43.         int height, width;  
  44.         frameDs->get_Height(&height);  
  45.         frameDs->get_Width(&width);  
  46.         printf("Frame: %d  %d\n", height, width);  
  47.         UINT ncaps = 0;  
  48.         UINT16* buff = nullptr;  
  49.         depthf->AccessUnderlyingBuffer(&ncaps, &buff); // 获取深度数据的指针和大小  
  50.         //depthf->CopyFrameDataToArray(...); // 讲深度数据Copy到制定的buffer中  
  51.           
  52.         printf("Buffer size: %d\n", ncaps);  
  53.   
  54.         depthf->Release();  
  55.         frameDs->Release();  
  56.         Sleep(200);  
  57.     }  
  58.       
  59.   
  60.     pKinect->Close();  
  61. endstop:  
  62.     system("pause");  
  63.     return 0;  
  64. }  

3、红外数据获取

Kinect的核心计算就是根据红外数据的,我们也来获取一下看看。其实,它和深度数据没啥区别,真的,大小、用法也一摸一样。

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. /* 
  2. Frame: 424  512 
  3. Buffer size: 217088 
  4. */  
  5. int _tmain(int argc, _TCHAR* argv[])  
  6. {  
  7.     printf("Hello, Wellcome to kinect world!\n");  
  8.     IKinectSensor* pKinect = nullptr;  
  9.     GetDefaultKinectSensor(&pKinect);  
  10.     if ( !pKinect)  
  11.     {  
  12.         printf("Get Kinect failed!\n");  
  13.         goto endstop;  
  14.     }  
  15.     pKinect->Open();  
  16.     BOOLEAN bOpen = false;  
  17.     // 一直等待直到Kinect打开完成  
  18.     while (!bOpen)  
  19.     {  
  20.         pKinect->get_IsOpen(&bOpen);  
  21.         Sleep(200);  
  22.     }  
  23.     IInfraredFrameSource* infrareds = nullptr;  
  24.     pKinect->get_InfraredFrameSource(&infrareds); // 获取红外数据源  
  25.     IInfraredFrameReader* infraredr = nullptr;  
  26.     infrareds->OpenReader(&infraredr); // 打开红外解析器  
  27.     while (true)  
  28.     {  
  29.         IInfraredFrame* infraredf = nullptr;  
  30.         infraredr->AcquireLatestFrame(&infraredf); // 获取最近的红外数据  
  31.         if (!infraredf)  
  32.         {  
  33.             Sleep(200);  
  34.             continue;  
  35.         }  
  36.         IFrameDescription* frameDs = nullptr;  
  37.         infraredf->get_FrameDescription(&frameDs); // 获取红外信息的属性  
  38.         int height, width;  
  39.         frameDs->get_Height(&height);  
  40.         frameDs->get_Width(&width);  
  41.         printf("Frame: %d  %d\n", height, width);  
  42.         UINT ncaps = 0;  
  43.         UINT16* buff = nullptr;  
  44.         infraredf->AccessUnderlyingBuffer(&ncaps, &buff); // 获取红外数据的指针和大小  
  45.         //depthf->CopyFrameDataToArray(...); // 将数据Copy到制定的buffer中  
  46.           
  47.         printf("Buffer size: %d\n", ncaps);  
  48.   
  49.         infraredf->Release();  
  50.         frameDs->Release();  
  51.         Sleep(200);  
  52.     }  
  53.       
  54.   
  55.     pKinect->Close();  
  56. endstop:  
  57.     system("pause");  
  58.     return 0;  
  59. }  

4、摄像头数据获取

摄像头也很简单的,不用看也知道,和上面的差不多。直接上代码了。

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. /* 
  2. Frame: 1080  1920 
  3. Buffer size: 4147200 
  4. */  
  5. int _tmain(int argc, _TCHAR* argv[])  
  6. {  
  7.     printf("Hello, Wellcome to kinect world!\n");  
  8.     IKinectSensor* pKinect = nullptr;  
  9.     GetDefaultKinectSensor(&pKinect);  
  10.     if ( !pKinect)  
  11.     {  
  12.         printf("Get Kinect failed!\n");  
  13.         goto endstop;  
  14.     }  
  15.     pKinect->Open();  
  16.     BOOLEAN bOpen = false;  
  17.     // 一直等待直到Kinect打开完成  
  18.     while (!bOpen)  
  19.     {  
  20.         pKinect->get_IsOpen(&bOpen);  
  21.         Sleep(200);  
  22.     }  
  23.     IColorFrameSource* colorfs = nullptr;  
  24.     pKinect->get_ColorFrameSource(&colorfs); // 获取图像数据源  
  25.     IColorFrameReader* colorfr = nullptr;  
  26.     colorfs->OpenReader(&colorfr); // 打开解析器  
  27.     while (true)  
  28.     {  
  29.         IColorFrame* colorf = nullptr;  
  30.         colorfr->AcquireLatestFrame(&colorf); // 获取最近的数据  
  31.         if (!colorf)  
  32.         {  
  33.             Sleep(200);  
  34.             continue;  
  35.         }  
  36.         IFrameDescription* frameDs = nullptr;  
  37.         colorf->get_FrameDescription(&frameDs); // 获取信息的属性  
  38.         int height, width;  
  39.         frameDs->get_Height(&height);  
  40.         frameDs->get_Width(&width);  
  41.         printf("Frame: %d  %d\n", height, width);  
  42.         UINT ncaps = 0;  
  43.         BYTE* buff = nullptr;  
  44.         colorf->AccessRawUnderlyingBuffer(&ncaps, &buff); // 获取数据的指针和大小  
  45.         //depthf->CopyFrameDataToArray(...); // 将数据Copy到制定的buffer中  
  46.           
  47.         printf("Buffer size: %d\n", ncaps);  
  48.   
  49.         colorf->Release();  
  50.         frameDs->Release();  
  51.         Sleep(200);  
  52.     }  
  53.       
  54.   
  55.     pKinect->Close();  
  56. endstop:  
  57.     system("pause");  
  58.     return 0;  
  59. }  

基本数据已经全部获取到了,其他高级功能后面继续讨论。



猜你喜欢

转载自blog.csdn.net/zhazhiqiang2010/article/details/52527505
今日推荐