3

Kinect センサーと SDK を使用してユーザーの頭の向きを計算しようとしていますが、Google でこれに関する適切なヘルプを見つけることができませんでした。誰かが私を助けるかもしれない良いサンプル、チュートリアル、またはそのようなものを持っていますか?

4

2 に答える 2

2

制限はありますが、解決策を見つけたと思いFaceTrackFrameます。オブジェクトを使用しているため、KinectSDKが顔を検出できる場合にのみ機能します。

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;
        }
于 2013-02-08T02:57:19.623 に答える
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));

RollAngle = Math.Acos(XDifference / r);
于 2013-02-05T23:46:49.980 に答える