Я хотел бы сохранить данные захвата движения из Kinect 2 в виде файла BVH. Я нашел код, который делает это для Kinect 1, который можно найти здесь . Я просмотрел код и обнаружил несколько вещей, которые не смог понять. Например, в упомянутом коде я попытался понять, что именно представляет собой skel
объект Skeleton , найденный в нескольких местах кода. Если нет, есть ли какое-либо известное приложение, доступное для выполнения запланированного?
РЕДАКТИРОВАТЬ: Я попытался изменить 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);
Я получил ошибки при вызове функции Position для Body skel. Как я могу получить 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);
РЕДАКТИРОВАТЬ: В основном мне удалось сохранить файл 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
рассчитывается.
источник
Ответы:
Код, который вы использовали для Kinect 1.0 для получения файла BVH, использует информацию о соединениях для построения костных векторов, читая Skeleton .
Источник: Нгуен Лен Инг - Kinect2BVH.V2
За исключением Kinect 2.0 , класс Skeleton был заменен классом Body , поэтому вам нужно изменить его, чтобы вместо этого использовать Body , и получить соединения, выполнив шаги, указанные ниже.
Источник: блог Vangos Pterneas - KINECT FOR WINDOWS VERSION 2: Отслеживание тела
источник