Me gustaría almacenar los datos de captura de movimiento de Kinect 2 como un archivo BVH. Encontré un código que lo hace para Kinect 1 que se puede encontrar aquí . Revisé el código y encontré varias cosas que no pude entender. Por ejemplo, en el código mencionado he tratado de comprender qué es exactamente el skel
objeto Skeleton , que se encuentra en varios lugares del código. Si no, ¿hay alguna aplicación conocida disponible para lograr el objetivo?
EDITAR: Traté de cambiar Skeleton skel a Body skel, que creo que es el objeto correspondiente para kinect SDK 2.0. Sin embargo, tengo un error cuando intento obtener la posición del cuerpo:
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);
Recibí errores al llamar a la función Posición para el skel del cuerpo. ¿Cómo puedo recuperar la X, Y, Z del esqueleto en SDK 2.0? Traté de cambiar las tres líneas anteriores a:
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);
EDITAR: Básicamente logré almacenar el archivo bvh después de combinar bodyBasicsWPF y kinect2bvh. Sin embargo, parece que el esqueleto que estoy almacenando no es eficiente. Hay movimientos extraños en los codos. Estoy tratando de entender si tengo que cambiar algo en el archivo kinectSkeletonBVH.cp . Más específicamente, cuáles son los cambios en la orientación del eje de la articulación para la versión kinect 2. ¿Cómo puedo cambiar la siguiente línea skel.BoneOrientations[JointType.ShoulderCenter].AbsoluteRotation.Quaternion;
? Intenté cambiar esa línea con skel.JointOrientations[JointType.ShoulderCenter].Orientation
. Estoy en lo cierto? Estoy usando el siguiente código para agregar la unión a los 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);
No puedo entender dónde the axis for every Joint
se calcula el código interno .
fuente
Respuestas:
El código que usó para Kinect 1.0 para obtener un archivo BVH utiliza la información de las articulaciones para construir vectores óseos leyendo el Esqueleto .
Fuente: Nguyên Lê Đặng - Kinect2BVH.V2
Excepto en Kinect 2.0 , la clase Esqueleto ha sido reemplazada por la clase Cuerpo , por lo que debe cambiarla para tratar con un Cuerpo y obtener las articulaciones siguiendo los pasos que se detallan a continuación.
Fuente: Blog de Vangos Pterneas - KINECT PARA WINDOWS VERSIÓN 2: SEGUIMIENTO CORPORAL
fuente