Kinect:计算头部俯仰、偏航和翻滚角度。

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

你是在捕捉站立玩家的完整骨架时考虑方向,还是玩家坐在Kinect传感器附近?如果玩家靠近,您可以使用“FaceTracking”功能来获取此信息,但头部方向不是常规骨架数据结构的一部分。 - Nicholas Pappas
我更喜欢一个站立的玩家,但如果不可能的话,我可以接受一个靠近传感器的坐着的玩家。我知道我可以使用FaceTracking,但问题是,如果用户例如将头转得太向右,FaceTracker将失去其映射。 - smukov
你需要研究如何扩展“FaceTracking”功能,或者编写自己的代码(不过最好以现有代码为基础)。即使“FaceTracking”代码无法渲染面部网格,它仍然可以跟踪重要点。我没有太多使用这个示例的经验,所以不确定。SDK的“开箱即用”功能不幸地没有你所需的值。 - Nicholas Pappas
2个回答

2
我认为我找到了一个解决方案,尽管它有限,它只在Kinect SDK可以检测到面部时才起作用,因为我正在使用FaceTrackFrame对象。
如果有人能找到一种解决方案,在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
我使用图像的深度数据手动计算出这些内容。
首先,您需要获取深度点。
    private EnumIndexableCollection<FeaturePoint, Vector3DF> depthPoints;

如果您查看随SDK附带的FaceTracking查看器代码并搜索DrawFaceModel函数,则可以在第一个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));

to

RollAngle = Math.Acos(XDifference / r);

用户需要靠近才能进行计算吗?还是您可以从远处计算这些数字? - Nicholas Pappas
2
只要SDK能够检测到用户的脸,它似乎就能正常运行。 - difurious
非常好。我期待着尝试它! - Nicholas Pappas
你知道“frame.Rotation”吗?我意识到我也可以通过该属性获取角度,例如“frame.Rotation.Z”会给我Roll,而X和Y会给我另外两个角度。这种解决方案的问题是只有当SDK能够检测到脸时才能跟踪角度,与你的解决方案类似存在限制。 - smukov
不,我并不知道关于框架旋转的事情,所以也许我会在某个时候尝试一下。 - difurious

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接