Зберігайте Kinect's v2.0 Motion to BVH File


298

Я б хотів зберігати дані захоплення руху від Kinect 2 як файл BVH. Я знайшов код, який робить це для Kinect 1, який можна знайти тут . Я переглянув код і знайшов кілька речей, які я не зміг зрозуміти. Наприклад, у згаданому коді я намагався зрозуміти, що саме є skelоб'єктом Скелет , знайденим у кількох місцях у коді. Якщо ні, чи є якась відома програма для досягнення наміченого?

EDIT: Я намагався змінити Skeleton skel на Body skel, що, на мою думку, є відповідним об'єктом для 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);

У мене виникли помилки під час виклику функції Позиція для тіла. Як я можу отримати X, Y, Z скелета в sdk 2.0 ?? Я намагався змінити вищевказані три рядки на:

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);

EDIT: В основному мені вдалося зберегти файл bvh після поєднання bodyBasicsWPF і kinect2bvh. Однак здається, що скелет, який я зберігаю, не є ефективним. У ліктях спостерігаються дивні рухи. Я намагаюся зрозуміти, чи потрібно щось змінювати у файлі 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.
Хосе Рамон

Я можу зберігати інформацію про Kinect v1 та v2 для файлу txt. Цей файл BVH - це те, що я щойно прочитав, і він буде функцією, яку я додаю до нашого програмного забезпечення для придбання. Якщо вас цікавлять * .txt файли, просто повідомте мене. У мене ще немає правильного рішення для BVH.
16пер9,

2
перевірка: pterneas.com/2014/03/13/…
Khaled.K

1
У мене є спосіб правильно записати потоки Kinect v1 і Kinect v2 в txt. Можливо, якщо ви його використовуєте, ви можете двічі перевірити файли bvh для того ж експерименту. Перевірте мою біографію для отримання додаткової інформації.
16пер9

1
@ Khaled.K Якщо посилання, яке ви опублікували, відповідає на це, ви б задумали перетворити це на відповідь на це питання (на це мета-запитання )
Метт Томас

Відповіді:


2

Код, який ви використовували для Kinect 1.0 для отримання файлу BVH, використовує інформацію про суглоби для побудови кісткових векторів, читаючи Скелет .

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ên Lê Đặng - Kinect2BVH.V2

За винятком Kinect 2.0 , клас Скелет був замінений класом 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();
}

Ми також додали список тіл, де будуть збережені всі пов'язані з тілом / скелетом дані. Якщо ви розробили для версії 1 Kinect, ви помітили, що клас Скелет був замінений класом Body. Пам'ятаєте MultiSourceFrameReader? Цей клас надає нам доступ до кожного потоку, включаючи тіло! Нам просто потрібно повідомити датчику, що нам потрібна функція відстеження тіла, додавши додатковий параметр при ініціалізації зчитувача:

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

_reader.MultiSourceFrameArrived += Reader_MultiSourceFrameArrived;

Метод Reader_MultiSourceFrameArrived буде викликатися, коли буде доступний новий кадр. Давайте уточнимо, що буде з точки зору даних тіла:

  1. Отримайте посилання на рамку кузова
  2. Перевірте, чи є рамка кузова нульовою - це дуже важливо
  3. Ініціалізуйте список _bodies
  4. Викличте метод GetAndRefreshBodyData, щоб скопіювати дані тіла у список
  5. Перегляньте список тіл і робіть приголомшливі речі!

Завжди не забудьте перевірити наявність нульових значень. 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 - КІНЕКТ ДЛЯ WINDOWS ВЕРСІЯ 2: Відслідковування тіл

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.