Kinectのv2.0モーションをBVHファイルに保存


298

Kinect 2のモーションキャプチャデータをBVHファイルとして保存したいと思います。ここで見つけることができるKinect 1のためにそうするコードを見つけまし。コードを調べたところ、理解できないことがいくつか見つかりました。たとえば、前述のコードskelでは、コード内のいくつかの場所にあるSkeleton オブジェクトが実際に何であるかを理解しようとしました。そうでない場合、目的を達成するために利用できる既知のアプリケーションはありますか?

編集:私はスケルトンのスケルをボディのスケルに変更しようとしましたが、これはkinect SDK 2.0の対応するオブジェクトだと思います。しかし、体の位置を取得しようとするとエラーが発生します。

tempMotionVektor[0] = -Math.Round( skel.Position.X * 100,2);
tempMotionVektor[1] = Math.Round( skel.Position.Y * 100,2) + 120;
tempMotionVektor[2] = 300 - Math.Round( skel.Position.Z * 100,2);

Body skelの関数Positionを呼び出すときにエラーが発生しました。SDK 2.0でスケルトンのX、Y、Zを取得するにはどうすればよいですか?上記の3行を次のように変更しようとしました。

tempMotionVektor[0] = -Math.Round(skel.Joints[0].Position.X * 100, 2);
tempMotionVektor[1] = Math.Round(skel.Joints[0].Position.Y * 100, 2) + 120;
tempMotionVektor[2] = 300 - Math.Round(skel.Joints[0].Position.Z * 100, 2);

編集:基本的に、bodyBasicsWPFとkinect2bvhを組み合わせた後、bvhファイルを保存することができました。しかし、私が保存しているスケルトンは効率的ではないようです。肘に奇妙な動きがあります。kinectSkeletonBVH.cpファイルで何かを変更する必要があるかどうかを理解しようとしています。より具体的には、kinect 2バージョンのジョイント軸方向の変更は何ですか。次の行を変更するにはどうすればよいですか:でskel.BoneOrientations[JointType.ShoulderCenter].AbsoluteRotation.Quaternion; その行を変更しようとしましたskel.JointOrientations[JointType.ShoulderCenter].Orientation。私は正しいですか?次のコードを使用して、BVHBoneオブジェクトにジョイントを追加します。

BVHBone hipCenter = new BVHBone(null, JointType.SpineBase.ToString(), 6, TransAxis.None, true);
BVHBone hipCenter2 = new BVHBone(hipCenter, "HipCenter2", 3, TransAxis.Y, false);
BVHBone spine = new BVHBone(hipCenter2, JointType.SpineMid.ToString(), 3, TransAxis.Y, true);
BVHBone shoulderCenter = new BVHBone(spine, JointType.SpineShoulder.ToString(), 3, TransAxis.Y, true);

BVHBone collarLeft = new BVHBone(shoulderCenter, "CollarLeft", 3, TransAxis.X, false);
BVHBone shoulderLeft = new BVHBone(collarLeft, JointType.ShoulderLeft.ToString(), 3, TransAxis.X, true);
BVHBone elbowLeft = new BVHBone(shoulderLeft, JointType.ElbowLeft.ToString(), 3, TransAxis.X, true);
BVHBone wristLeft = new BVHBone(elbowLeft, JointType.WristLeft.ToString(), 3, TransAxis.X, true);
BVHBone handLeft = new BVHBone(wristLeft, JointType.HandLeft.ToString(), 0, TransAxis.X, true);

BVHBone neck = new BVHBone(shoulderCenter, "Neck", 3, TransAxis.Y, false);
BVHBone head = new BVHBone(neck, JointType.Head.ToString(), 3, TransAxis.Y, true);
BVHBone headtop = new BVHBone(head, "Headtop", 0, TransAxis.None, false);

コードのどこthe axis for every Jointが計算されるのか理解できません。


9
私はこの問題をスキップしましたが、解決策がある場合は、多くの人がbvhファイルに動きを保存しようとしていることに気付いたので、私だけでなくここに投稿することをお勧めします。
Jose Ramon

txtファイルのKinect v1およびv2情報を保存できます。このBVHファイルは今読んだもので、取得ソフトウェアに追加する機能になります。* .txtファイルに関心がある場合は、お知らせください。まだ適切なBVHソリューションを持っていません。
16per9


1
Kinect v1およびKinect v2ストリームをtxtに適切に書き込む方法があります。多分それを使うなら、同じ実験のためにあなたのbvhのファイルを再確認することができます。詳細は私の略歴を確認してください。
16per9

1
@ Khaled.Kあなたが投稿したリンクがこれに答える場合は、それをこの質問への回答にしてください(このメタ質問による
Matt Thomas

回答:


2

Kinect 1.0でBVHファイルを取得するために使用したコードは、関節情報を使用して、Skeletonを読み取ることにより骨ベクトルを構築ます。

public static double[] getBoneVectorOutofJointPosition(BVHBone bvhBone, Skeleton skel)
{
    double[] boneVector = new double[3] { 0, 0, 0 };
    double[] boneVectorParent = new double[3] { 0, 0, 0 };
    string boneName = bvhBone.Name;

    JointType Joint;
    if (bvhBone.Root == true)
    {
        boneVector = new double[3] { 0, 0, 0 };
    }
    else
    {
        if (bvhBone.IsKinectJoint == true)
        {
            Joint = KinectSkeletonBVH.String2JointType(boneName);

            boneVector[0] = skel.Joints[Joint].Position.X;
            boneVector[1] = skel.Joints[Joint].Position.Y;
            boneVector[2] = skel.Joints[Joint].Position.Z;
..

ソース:NguyênLêĐặng-Kinect2BVH.V2

Kinect 2.0を除き、SkeletonクラスはBodyクラスに置き換えられているため、代わりにそれを変更してBodyを処理し、以下に示す手順に従ってジョイントを取得する必要があります。

// Kinect namespace
using Microsoft.Kinect;

// ...

// Kinect sensor and Kinect stream reader objects
KinectSensor _sensor;
MultiSourceFrameReader _reader;
IList<Body> _bodies;

// Kinect sensor initialization
_sensor = KinectSensor.GetDefault();

if (_sensor != null)
{
    _sensor.Open();
}

ボディのリストも追加しました。ボディ/スケルトン関連のすべてのデータが保存されます。Kinectバージョン1用に開発した場合は、SkeletonクラスがBodyクラスに置き換えられていることに気づくでしょう。MultiSourceFrameReaderを覚えていますか?このクラスを使用すると、ボディストリームを含むすべてのストリームにアクセスできます。リーダーを初期化するときに追加のパラメーターを追加して、ボディトラッキング機能が必要であることをセンサーに通知するだけです。

_reader = _sensor.OpenMultiSourceFrameReader(FrameSourceTypes.Color |
                                             FrameSourceTypes.Depth |
                                             FrameSourceTypes.Infrared |
                                             FrameSourceTypes.Body);

_reader.MultiSourceFrameArrived += Reader_MultiSourceFrameArrived;

Reader_MultiSourceFrameArrivedメソッドは、新しいフレームが利用可能になるたびに呼び出されます。本文データに関して何が起こるかを指定しましょう:

  1. ボディフレームへの参照を取得する
  2. ボディフレームがnullかどうかを確認します-これは重要です
  3. _bodiesリストを初期化する
  4. GetAndRefreshBodyDataメソッドを呼び出して、本文データをリストにコピーします
  5. ボディのリストをループして、素晴らしいことをしてください!

常にnull値を確認することを忘れないでください。Kinectは、毎秒約30フレームを提供します。何もない場合や欠けている場合があります。これまでのコードは次のとおりです。

void Reader_MultiSourceFrameArrived(object sender,
            MultiSourceFrameArrivedEventArgs e)
{
    var reference = e.FrameReference.AcquireFrame();

    // Color
    // ...

    // Depth
    // ...

    // Infrared
    // ...

    // Body
    using (var frame = reference.BodyFrameReference.AcquireFrame())
    {
        if (frame != null)
        {
            _bodies = new Body[frame.BodyFrameSource.BodyCount];

            frame.GetAndRefreshBodyData(_bodies);

            foreach (var body in _bodies)
            {
                if (body != null)
                {
                    // Do something with the body...
                }
            }
        }
    }
}

これだよ!これで、Kinectが識別する体にアクセスできます。次のステップは、画面にスケルトン情報を表示することです。各ボディは25のジョイントで構成されています。センサーは、それぞれの位置(X、Y、Z)と回転情報を提供します。さらに、Kinectは、関節が追跡されているか、仮定されているか、追跡されていないかを知らせます。重要な機能を実行する前に、ボディが追跡されているかどうかを確認することをお勧めします。

次のコードは、さまざまな体の関節にアクセスする方法を示しています。

if (body != null)
{
    if (body.IsTracked)
    {
        Joint head = body.Joints[JointType.Head];

        float x = head.Position.X;
        float y = head.Position.Y;
        float z = head.Position.Z;

        // Draw the joints...
    }
}

出典:Vangos Pterneasブログ-KINECT FOR WINDOWS VERSION 2:BODY TRACKING

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.