Ответ 1
Я сделал это, когда рамка врачей проецируется на рамку пациентов, но со всем скелетом это не так хорошо работает из-за разных высот костей:/. Код можно найти здесь. Он находится в коде бета-версии 2, более текущую версию можно найти здесь, хотя в настоящее время он отлично работает
Что касается сравнения, сделайте что-то вроде этого
for (int i = 0; i < patientList.Count; i++)
{
int diff = (int)Math.Abs(patientList[i] - doctorList[i]);
if (diff < 100) //or whatever number you want
{
Debug.WriteLine("Good Job");
}
}
Я отказался от идеи целой фигуры из-за высоты костей, упомянутой Fixus, поэтому моя текущая программа выглядит примерно так:
ИЗМЕНИТЬ
Это концепция раскрашивания двух движений с кинцетом и вычисления сходства между двумя движениями, которые я подробно объясняю.
Предположим, что у меня есть следующие 2 точки, точка A (0, 0, 0) и точка B (1, 1, 1). Теперь я хочу найти отличие от точки A до B, поэтому я бы вычитал все числа X, Y и Z, поэтому разница составляет 1 X 1 Y 1 Z. Это простой материал. Теперь его реализовать. Код, который я написал выше, I будет реализовываться следующим образом.
//get patient hand coordinates
double patienthandX = Canvas.GetLeft(patienthand);
double patienthandY = Canvas.GetTop(patienthand);
//get doctor hand coordinates
double doctorhandX = Canvas.GetLeft(doctorhand);
double doctorhandY = Canvas.GetTop(doctorhand);
//compare difference for each x and y
//take Absolute value so that it is positive
double diffhandX = Math.Abs(patienthandX - doctorhandX);
double diffhandY = Math.Abs(patienthandY - doctorhandY);
Теперь возникает другая проблема. Координаты врача всегда одинаковы, но что, если пациент не стоит там, где были записаны координаты врача? Теперь мы реализуем более простую математику. Возьмем этот простой пример. предположим, что я хочу, чтобы точка A (8, 2) переместилась в точку B (4, 12). Вы умножаете x и y на A, чтобы добраться до B. Таким образом, я бы умножал X на .5 и Y на 6. Итак, для Kinect я бы поставил элемент на пациентах в тазобедренном суставе, а затем сравнил его с доктором hip, Затем умножьте всех суставов врача на это число, чтобы достичь врачебных суставов на вершине пациентов (более или менее). Например
double whatToMultiplyX = (double) doctorhipX / patienthipX;
double whatToMultiplyY = (double) doctorhipY / patienthipY;
Это все довольно просто, но собрать его вместе - труднее. Пока мы, 1) Масштабируем рамы врача поверх рамок пациента, 2) Рассчитаем разницу. 3) Сравните разницу во всей репутации. и 4) Reset для следующего представителя. Это кажется простым, но это не так. Чтобы вычислить всю разницу для rep, сделайте следующее:
//get patient hand coordinates
double patienthandX = Canvas.GetLeft(patienthand);
double patienthandY = Canvas.GetTop(patienthand);
//get doctor hand coordinates
double doctorhandX = Canvas.GetLeft(doctorhand);
double doctorhandY = Canvas.GetTop(doctorhand);
//compare difference for each x and y
//take Absolute value so that it is positive
double diffhandX = Math.Abs(patienthandX - doctorhandX);
double diffhandY = Math.Abs(patienthandY - doctrorhandY);
//+= so that it keeps adding to it.
totaldiffhandX += diffhandX;
totaldiffhandY += diffhandY;
Теперь мы можем сравнить и сказать:
if (totaldiffhandX < 1000 && totaldiffhandY < 1000) //keep numbers pretty high since it is an entire rep
{
//reset difference
totaldiffhandX = 0;
totaldiffhandY = 0;
//tell the patient good job
Debug.WriteLine("Good Job");
}
Это довольно легко, но имейте в виду, что должен делать это для каждого совместного x и y. Иначе это не сработает. Надеюсь, что это поможет.