Chciałbym zapisać dane przechwytywania ruchu z Kinect 2 jako plik BVH. Znalazłem kod, który robi to dla Kinect 1, który można znaleźć tutaj . Przejrzałem kod i znalazłem kilka rzeczy, których nie byłem w stanie zrozumieć. Na przykład we wspomnianym kodzie próbowałem zrozumieć, czym dokładnie jest skel
obiekt Skeleton , znaleziony w kilku miejscach w kodzie. Jeśli nie, to czy są dostępne jakieś znane aplikacje do osiągnięcia zamierzonego celu?
EDYCJA: Próbowałem zmienić szkielet szkieletu na szkielet ciała, który moim zdaniem jest odpowiednim obiektem dla kinect SDK 2.0. Mam jednak błąd, gdy próbuję uzyskać pozycję ciała:
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);
Wystąpiły błędy podczas wywoływania funkcji Pozycja dla szkieletu ciała. Jak mogę pobrać X, Y, Z szkieletu w SDK 2.0? Próbowałem zmienić powyższe trzy linie na:
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);
EDYCJA: Zasadniczo udało mi się zapisać plik bvh po połączeniu bodyBasicsWPF i kinect2bvh. Wydaje się jednak, że szkielet, który przechowuję, nie jest wydajny. Dziwne ruchy w łokciach. Próbuję zrozumieć, czy muszę coś zmienić w pliku kinectSkeletonBVH.cp . Mówiąc dokładniej, jakie są zmiany orientacji osi złącza dla wersji kinect 2. Jak mogę zmienić następujący wiersz: skel.BoneOrientations[JointType.ShoulderCenter].AbsoluteRotation.Quaternion;
Próbowałem zmienić ten wiersz za pomocą skel.JointOrientations[JointType.ShoulderCenter].Orientation
. Czy mam rację? Używam następującego kodu, aby dodać połączenie do obiektów 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);
Nie rozumiem, gdzie the axis for every Joint
jest obliczany kod .
źródło
Odpowiedzi:
Kod użyty w Kinect 1.0 do uzyskania pliku BVH wykorzystuje informacje o stawach do budowy wektorów kości poprzez czytanie Szkieletu .
Źródło: Nguyên Lê Đặng - Kinect2BVH.V2
Z wyjątkiem Kinect 2.0 , klasa Szkieletów została zastąpiona klasą Ciało , więc musisz ją zmienić, aby zamiast tego poradzić sobie z Ciałem , i uzyskać stawy, wykonując poniższe kroki.
Źródło: Blog Vangos Pterneas - KINECT FOR WINDOWS VERSION 2: BODY TRACKING
źródło