【原文:http://blog.csdn.net/bbdxf/article/details/44857099】
Kinect V2 开发专题(4)
1、骨骼数据获取
2、深度数据获取
3、红外图像获取
4、摄像头数据获取
1、骨骼数据获取
前面的代码省略,从获取数据开始:
- // 获取身体数据
- IBodyFrameSource* bodys = nullptr;
- bb->get_BodyFrameSource(&bodys); // Body 数据源
- INT32 nBodyNum = 0;
- bodys->get_BodyCount(&nBodyNum); // 获取body 个数,没用,一直是6
- printf("Body Num: %d\n", nBodyNum);
- IBodyFrameReader* bodyr = nullptr;
- bodys->OpenReader(&bodyr); // 准备读取body数据
- while (true)
- {
- IBodyFrame* bodyf = nullptr;
- bodyr->AcquireLatestFrame(&bodyf); // 获取最近的一帧数据
- if ( !bodyf )
- {
- Sleep(100);
- printf(".");
- continue;
- }
- IBody* ppBodies[BODY_COUNT] = { 0 };
- bodyf->GetAndRefreshBodyData(BODY_COUNT, ppBodies); // 更新所有人身体数据
- for (int i = 0; i < BODY_COUNT; ++i)
- {
- IBody* pBody = ppBodies[i]; // 轮询每个人的信息
- if (pBody)
- {
- BOOLEAN bTracked = false;
- hr = pBody->get_IsTracked(&bTracked); // 检测是否被跟踪,即是否有这个人
- if (bTracked)
- {
- Joint joints[JointType_Count];
- HandState leftHandState = HandState_Unknown;
- HandState rightHandState = HandState_Unknown;
- pBody->get_HandLeftState(&leftHandState); // 获取左手的状态
- pBody->get_HandRightState(&rightHandState); // 获取右手的状态
- hr = pBody->GetJoints(_countof(joints), joints); // 获取身体的骨骼信息,25点
- printf("Person %d : Joints[0].Z %.2f\n", i, joints[0].Position.Z); //简单的输出他的信息
- }
- }
- }
- for (int i = 0; i < BODY_COUNT; ++i)
- {
- ppBodies[i]->Release();
- }
- bodyf->Release();
- }
2、深度数据获取
有了骨骼信息,深度数据就显得没太大的用处了。
- /*
- Depth min: 500 max: 4500
- Frame: 424 512
- Buffer size: 217088
- */
- int _tmain(int argc, _TCHAR* argv[])
- {
- printf("Hello, Wellcome to kinect world!\n");
- IKinectSensor* pKinect = nullptr;
- GetDefaultKinectSensor(&pKinect);
- if ( !pKinect)
- {
- printf("Get Kinect failed!\n");
- goto endstop;
- }
- pKinect->Open();
- BOOLEAN bOpen = false;
- // 一直等待直到Kinect打开完成
- while (!bOpen)
- {
- pKinect->get_IsOpen(&bOpen);
- Sleep(200);
- }
- IDepthFrameSource* depths = nullptr;
- pKinect->get_DepthFrameSource(&depths); // 获取深度数据源
- IDepthFrameReader* depthr = nullptr;
- depths->OpenReader(&depthr); // 打开深度解析器
- while (true)
- {
- IDepthFrame* depthf = nullptr;
- depthr->AcquireLatestFrame(&depthf); // 获取最近的深度数据
- if ( !depthf )
- {
- Sleep(200);
- continue;
- }
- USHORT minds, maxds;
- depthf->get_DepthMinReliableDistance(&minds); // 获取最近的有效距离,500
- depthf->get_DepthMaxReliableDistance(&maxds); // 获取最远的有效距离,4500
- printf("Depth min: %d max: %d\n", minds, maxds);
- IFrameDescription* frameDs = nullptr;
- depthf->get_FrameDescription(&frameDs); // 获取深度信息的属性
- int height, width;
- frameDs->get_Height(&height);
- frameDs->get_Width(&width);
- printf("Frame: %d %d\n", height, width);
- UINT ncaps = 0;
- UINT16* buff = nullptr;
- depthf->AccessUnderlyingBuffer(&ncaps, &buff); // 获取深度数据的指针和大小
- //depthf->CopyFrameDataToArray(...); // 讲深度数据Copy到制定的buffer中
- printf("Buffer size: %d\n", ncaps);
- depthf->Release();
- frameDs->Release();
- Sleep(200);
- }
- pKinect->Close();
- endstop:
- system("pause");
- return 0;
- }
3、红外数据获取
Kinect的核心计算就是根据红外数据的,我们也来获取一下看看。其实,它和深度数据没啥区别,真的,大小、用法也一摸一样。
- /*
- Frame: 424 512
- Buffer size: 217088
- */
- int _tmain(int argc, _TCHAR* argv[])
- {
- printf("Hello, Wellcome to kinect world!\n");
- IKinectSensor* pKinect = nullptr;
- GetDefaultKinectSensor(&pKinect);
- if ( !pKinect)
- {
- printf("Get Kinect failed!\n");
- goto endstop;
- }
- pKinect->Open();
- BOOLEAN bOpen = false;
- // 一直等待直到Kinect打开完成
- while (!bOpen)
- {
- pKinect->get_IsOpen(&bOpen);
- Sleep(200);
- }
- IInfraredFrameSource* infrareds = nullptr;
- pKinect->get_InfraredFrameSource(&infrareds); // 获取红外数据源
- IInfraredFrameReader* infraredr = nullptr;
- infrareds->OpenReader(&infraredr); // 打开红外解析器
- while (true)
- {
- IInfraredFrame* infraredf = nullptr;
- infraredr->AcquireLatestFrame(&infraredf); // 获取最近的红外数据
- if (!infraredf)
- {
- Sleep(200);
- continue;
- }
- IFrameDescription* frameDs = nullptr;
- infraredf->get_FrameDescription(&frameDs); // 获取红外信息的属性
- int height, width;
- frameDs->get_Height(&height);
- frameDs->get_Width(&width);
- printf("Frame: %d %d\n", height, width);
- UINT ncaps = 0;
- UINT16* buff = nullptr;
- infraredf->AccessUnderlyingBuffer(&ncaps, &buff); // 获取红外数据的指针和大小
- //depthf->CopyFrameDataToArray(...); // 将数据Copy到制定的buffer中
- printf("Buffer size: %d\n", ncaps);
- infraredf->Release();
- frameDs->Release();
- Sleep(200);
- }
- pKinect->Close();
- endstop:
- system("pause");
- return 0;
- }
4、摄像头数据获取
摄像头也很简单的,不用看也知道,和上面的差不多。直接上代码了。
- /*
- Frame: 1080 1920
- Buffer size: 4147200
- */
- int _tmain(int argc, _TCHAR* argv[])
- {
- printf("Hello, Wellcome to kinect world!\n");
- IKinectSensor* pKinect = nullptr;
- GetDefaultKinectSensor(&pKinect);
- if ( !pKinect)
- {
- printf("Get Kinect failed!\n");
- goto endstop;
- }
- pKinect->Open();
- BOOLEAN bOpen = false;
- // 一直等待直到Kinect打开完成
- while (!bOpen)
- {
- pKinect->get_IsOpen(&bOpen);
- Sleep(200);
- }
- IColorFrameSource* colorfs = nullptr;
- pKinect->get_ColorFrameSource(&colorfs); // 获取图像数据源
- IColorFrameReader* colorfr = nullptr;
- colorfs->OpenReader(&colorfr); // 打开解析器
- while (true)
- {
- IColorFrame* colorf = nullptr;
- colorfr->AcquireLatestFrame(&colorf); // 获取最近的数据
- if (!colorf)
- {
- Sleep(200);
- continue;
- }
- IFrameDescription* frameDs = nullptr;
- colorf->get_FrameDescription(&frameDs); // 获取信息的属性
- int height, width;
- frameDs->get_Height(&height);
- frameDs->get_Width(&width);
- printf("Frame: %d %d\n", height, width);
- UINT ncaps = 0;
- BYTE* buff = nullptr;
- colorf->AccessRawUnderlyingBuffer(&ncaps, &buff); // 获取数据的指针和大小
- //depthf->CopyFrameDataToArray(...); // 将数据Copy到制定的buffer中
- printf("Buffer size: %d\n", ncaps);
- colorf->Release();
- frameDs->Release();
- Sleep(200);
- }
- pKinect->Close();
- endstop:
- system("pause");
- return 0;
- }
基本数据已经全部获取到了,其他高级功能后面继续讨论。