Kinect:计算头部的俯仰,偏航,侧倾角度

时间:2013-02-05 15:52:11

标签: c# kinect

我正在尝试使用Kinect传感器和SDK来计算用户头部的方向,但我无法在谷歌上找到任何有用的帮助。有没有人有任何好的样本,教程或类似的东西可以帮助我?

2 个答案:

答案 0 :(得分:2)

我认为我找到了一个解决方案,虽然它有限,只有在我使用FaceTrackFrame对象后Kinect SDK可以检测到面部时才有效。

如果有人在Kinect SDK无法检测到脸部的情况下找到跟踪更极端角度的解决方案,我会更乐意看到它。

我的解决方案看起来像这样:

       FaceTrackFrame faceFrame = faceTracker.Track(
            kinectSensor.ColorStream.Format, colorPixelData,
            kinectSensor.DepthStream.Format, depthPixelData, skeleton);

        // Only works if face is detected
        if (faceFrame.TrackSuccessful)
        {
            txtTracked.Content = "TRACKED";
            txtRoll.Content = faceFrame.Rotation.Z;
            txtPitch.Content = faceFrame.Rotation.X;
            txtYaw.Content = faceFrame.Rotation.Y;
        }

答案 1 :(得分:1)

我设法使用图片中的深度数据手动计算这些。

首先,您需要获得深度点

    private EnumIndexableCollection<FeaturePoint, Vector3DF> depthPoints;

然后,如果您查看SDK附带的FaceTracking查看器代码并搜索DrawFaceModel函数。你可以在1st for循环中提取这样的代码。

    faceModelPts3D.Add(new Point3D(this.depthPoints[i].X + 0.5f, this.depthPoints[i].Y + 0.5f, this.depthPoints[i].Z + 0.5f));
    FaceDataPoints.DepthXPointInfo[i] = this.depthPoints[i].X;
    FaceDataPoints.DepthYPointInfo[i] = this.depthPoints[i].Y;
    FaceDataPoints.DepthZPointInfo[i] = this.depthPoints[i].Z;

然后我将点0和点9放入以下函数中以获得音高。然后我将点120和116放入以获得哈欠角。

    public static double FacePitch(double FirstXPos, double FirstYPos, double FirstZPos, double SecXPos, double SecYPos, double SecZPos)
    {
        double PitchAngle = 0;
        double r = 0;
        double XDifference, YDifference, ZDifference = 0;
        double DifferenceSquared = 0;

        XDifference = FirstXPos - SecXPos;//Calculates distance from Points 
        YDifference = FirstYPos - SecYPos;
        ZDifference = FirstZPos - SecZPos;

        DifferenceSquared = Math.Pow(XDifference, 2) + Math.Pow(YDifference, 2) + Math.Pow(ZDifference, 2);

        r = Math.Sqrt(DifferenceSquared);

        PitchAngle = (Math.Acos(ZDifference / r));

        PitchAngle = ((PitchAngle * 180 / Math.PI) - 90) * -1; //Converts to Degrees as easier to recognise visually 

        return PitchAngle;
    }

对于滚动我再次将点0和9放入并再次使用上述功能但我改变了

PitchAngle = (Math.Acos(ZDifference / r));

RollAngle = Math.Acos(XDifference / r);
相关问题