Gostaria de armazenar os dados de captura de movimento do Kinect 2 como um arquivo BVH. Encontrei um código que o faz para o Kinect 1, que pode ser encontrado aqui . Examinei o código e encontrei várias coisas que não consegui entender. Por exemplo, no código mencionado, tentei entender o que exatamente é o skel
objeto Skeleton , encontrado em vários lugares do código. Caso contrário, existe algum aplicativo conhecido disponível para realizar o objetivo?
EDIT: Tentei mudar o Skeleton skel para Body skel, que eu acho que é o objeto correspondente do kinect SDK 2.0. No entanto, tenho um erro ao tentar obter a posição do corpo:
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);
Eu obtive erros ao chamar a função Position para o skel do corpo. Como posso recuperar o X, Y, Z do esqueleto no sdk 2.0? Tentei alterar as três linhas acima para:
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: Basicamente, eu consegui armazenar o arquivo a bvh depois de combinar bodyBasicsWPF e kinect2bvh. No entanto, parece que o esqueleto que estou armazenando não é eficiente. Existem movimentos estranhos nos cotovelos. Estou tentando entender se tenho que alterar alguma coisa no arquivo kinectSkeletonBVH.cp . Mais especificamente, quais são as alterações na orientação do eixo da junta para a versão do kinect 2. Como posso alterar a seguinte linha: skel.BoneOrientations[JointType.ShoulderCenter].AbsoluteRotation.Quaternion;
Tentei alterar essa linha com skel.JointOrientations[JointType.ShoulderCenter].Orientation
. Estou certo? Estou usando o código a seguir para adicionar a junção aos objetos 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);
Não consigo entender onde the axis for every Joint
é calculado o interior do código .
fonte
Respostas:
O código que você usou para Kinect 1.0 para obter um arquivo BVH usa as informações das articulações para criar vetores ósseos lendo o Skeleton .
Fonte: Nguyên Lê Đặng - Kinect2BVH.V2
Exceto no Kinect 2.0 , a classe Skeleton foi substituída pela classe Body ; portanto, é necessário alterá-la para lidar com um Body e obter as juntas seguindo as etapas citadas abaixo.
Fonte: Blog Vangos Pterneas - KINECT FOR WINDOWS VERSÃO 2: RASTREAMENTO CORPORAL
fonte