Ответ 1
Код, который вы использовали для 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 класс Skeleton заменен классом 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(); }
Мы также добавили список тел, где все связанные с телом/скелетом данные будут сохранены. Если вы разработали для Kinect версии 1, вы обратите внимание, что класс Skeleton был заменен классом Body. Помните MultiSourceFrameReader? Этот класс дает нам доступ к каждый поток, включая поток тела! Нам просто нужно датчик знает, что нам нужна функция отслеживания тела, добавляя дополнительный параметр при инициализации считывателя:
_reader = _sensor.OpenMultiSourceFrameReader(FrameSourceTypes.Color | FrameSourceTypes.Depth | FrameSourceTypes.Infrared | FrameSourceTypes.Body); _reader.MultiSourceFrameArrived += Reader_MultiSourceFrameArrived;
Метод Reader_MultiSourceFrameArrived будет вызываться всякий раз, когда новый кадр доступен. Давайте уточним, что произойдет с точки зрения данные тела:
- Получить ссылку на рамку тела
- Проверьте, является ли тело кадра нулевым - это важно
- Инициализировать список _bodies
- Вызвать метод GetAndRefreshBodyData, чтобы скопировать данные тела в список
- Прокрутите список тел и сделайте потрясающий материал!
Всегда помните, что нужно проверить нулевые значения. 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: ОТКЛЮЧЕНИЕ ТЕЛА