Kinect v2.0原理介绍之五:只检测离kinect最近的人脸

~~有兴趣的小伙伴,加kinect算法交流群:462964980。

  • 在kinect v2.0自带的实例(c++)中,有一个FaceBasics-D2D的工程,完成的是工作是对人脸进行检测、判断头的角度和一些脸部的动作等。如下图所示:

Kinect v2.0原理介绍之五:只检测离kinect最近的人脸_第1张图片

  • 因为kinect最多可支持六个人的同时跟踪,有时候我们希望画面中出现多个人时,只跟踪人脸离kinect最近的那个人,实现的原理其实很简单,就是得到离kinect最近的那个人的id即可。
  • 只需要将void CFaceBasics::ProcessFaces()中的代码改动一下就可以了。
    HRESULT hr;
    IBody* ppBodies[BODY_COUNT] = {0};
    bool bHaveBodyData = SUCCEEDED( UpdateBodyData(ppBodies) );
    // 存放离kinect最近人的id。
    int n_id = 0;
    if (bHaveBodyData)
    {
        // 检查是否未被跟踪
        BOOLEAN bTracked = false;
        // kinect到人脸的距离
        double d_face = 10.0;

        if (SUCCEEDED(hr) && !bTracked)
        {
            for (int iFace = 0; iFace  < BODY_COUNT; ++iFace ) 
            {
                hr = ppBodies[iFace ]->get_IsTracked(&bTracked);
                if (SUCCEEDED(hr) && bTracked)
                {
                    Joint joints[JointType_Count]; 
                    hr = ppBodies[iFace ]->GetJoints(_countof(joints), joints);
                    if (SUCCEEDED(hr))
                    {
                        // A 3D location in camera space. 头部离kinect的距离 headJoint.Z;
                        CameraSpacePoint headJoint = joints[JointType_Head].Position;
                        if(headJoint.Z < d_face )
                        {
                            d_face = headJoint.Z;
                            // 得到的n_id就是离kinect最近人的id
                            n_id = iFace ;
                        }
                    }
                }
            }
            。。。。。。
            。。。。。。
        }
    }

你可能感兴趣的:(kinect,离kinect最近的)