1、骨骼数据获取
2、深度数据获取
3、红外图像获取
4、摄像头数据获取
前面的代码省略,从获取数据开始:
// 获取身体数据 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(); }
有了骨骼信息,深度数据就显得没太大的用处了。
/* 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; }
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; }
摄像头也很简单的,不用看也知道,和上面的差不多。直接上代码了。
/* 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; }
基本数据已经全部获取到了,其他高级功能后面继续讨论。