您的位置:首页 > 其它

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

2016-09-13 17:00 441 查看
【原文:http://blog.csdn.net/bbdxf/article/details/44857099

Kinect V2 开发专题(4)

 

1、骨骼数据获取

2、深度数据获取

3、红外图像获取

4、摄像头数据获取

 

 

1、骨骼数据获取

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

[cpp] view plain copy 





// 获取身体数据  
    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、深度数据获取

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

 

[cpp] view plain copy 





/* 
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的核心计算就是根据红外数据的,我们也来获取一下看看。其实,它和深度数据没啥区别,真的,大小、用法也一摸一样。

[cpp] view plain copy 





/* 
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、摄像头数据获取

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

 

[cpp] view plain copy 





/* 
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;  
}  

基本数据已经全部获取到了,其他高级功能后面继续讨论。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: