Хотя я не видел ваш код или как вы поняли отслеживание человека с наложенным скелетом, я рекомендую вам прочитать серию сообщений от Mike Taulty: http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2014/11/04/kinect-for-windows-v2-sdk-hello-custom-gesture-world-part-3.aspx (эта ссылка является 3-м постом из этой серии, вы найдете ссылки на # 1 и # 2 на самом верху).
Хотя он использует бета-версию GestureBuilder для отслеживания движений скелета, для меня это была отличная отправная точка для того, чтобы ускорить работу - особенно, говоря о настройке KINECT, прослушивателях событий и т. Д., Чтобы понять, как KINECT 2 получает свои фреймы и подключается к C# -коду. В части 2 он заполняет элемент управления в своем приложении WPF цветом, в зависимости от того, насколько зафиксирован прогресс записанных жестов, я думаю, что это может частично ответить на ваш вопрос относительно «живой переменной» на экране.
После того как вы последовали за учебником и определили соответствующие части кода для вас, вы понимаете, что можете (строго говоря) отбросить функциональность OnGestureFrameArrived, так как вам нужно будет изменить метод OnBodyFrameArrived. Здесь вы проверяете отслеживаемый объект, если он найден, вы можете получить доступ к его суставам и рассчитать их угол. Я написал результат в консольном окне для целей отладки, поэтому, наконец, вы должны написать этот результат переменной, которая подключена к элементу GUI, который отображает его.
public void OnBodyFrameArrived(object sender, BodyFrameArrivedEventArgs e)
{
using (var frame = e.FrameReference.AcquireFrame())
{
if (frame != null)
{
frame.GetAndRefreshBodyData(this.bodies);
var trackedBody = this.bodies.Where(b => b.IsTracked).FirstOrDefault();
if (trackedBody != null)
{
List<Joint> myJoints = new List<Joint>();
myJoints.Add(trackedBody.Joints[JointType.FootLeft]);
myJoints.Add(trackedBody.Joints[JointType.AnkleLeft]);
myJoints.Add(trackedBody.Joints[JointType.KneeLeft]);
if (myJoints.TrueForAll(x => x.TrackingState == TrackingState.Tracked))
{
Vector3D KneeLeft = new Vector3D(trackedBody.Joints[JointType.KneeLeft].Position.X, trackedBody.Joints[JointType.KneeLeft].Position.Y, trackedBody.Joints[JointType.KneeLeft].Position.Z);
Vector3D AnkleLeft = new Vector3D(trackedBody.Joints[JointType.AnkleLeft].Position.X, trackedBody.Joints[JointType.AnkleLeft].Position.Y, trackedBody.Joints[JointType.AnkleLeft].Position.Z);
Vector3D FootLeft = new Vector3D(trackedBody.Joints[JointType.FootLeft].Position.X, trackedBody.Joints[JointType.FootLeft].Position.Y, trackedBody.Joints[JointType.FootLeft].Position.Z);
Console.WriteLine("#1: " + AngleBetweenTwoVectors(AnkleLeft - KneeLeft, AnkleLeft - FootLeft));
}
}
else
{
this.OnTrackingIdLost(null, null);
}
}
}
}
public double AngleBetweenTwoVectors(Vector3D vectorA, Vector3D vectorB)
{
double dotProduct = 0.0;
vectorA.Normalize();
vectorB.Normalize();
dotProduct = Vector3D.DotProduct(vectorA, vectorB);
return (double)Math.Acos(dotProduct)/Math.PI * 180;
}
TLDR-версия: в зависимости от того, как обрабатывать ваши приобретенные KINECT кадров, необходимо определить правильное событие в коде, где отслеживаются тело найдено в кадре, там вы можете посмотреть для состояний различных суставов тела и вычисления углов.
Кроме того, если вы хотите, вы можете отправить мне свой код и я могу попытаться подключить это для вас, так как ваш код будет также представлять интерес для меня.
Если кто-то знал, как сделать код в нижней части первой ссылки работать для постоянного обновления переменной, которая была бы удивительной, тип Skeleton не существует в SDK 2.0, и я не могу назвать Body.Joints – Jicnon