Подтвердить что ты не робот

Сравнение сохраненного движения с другим движением с Kinect

Мне нужно разработать приложение, в котором пользователь (физиотерапевт) выполнит движение перед Kinect, я напишу движение данных в базе данных, а затем пациент попытается подражать этому движению. Система будет вычислять сходство между записанным и выполненным движением.

Моя первая идея - во время записи (каждые 5 секунд, например) сохранить позицию (x, y, z) точек, а затем сравнить их во время выполнения (пациентом).

Я знаю, что этот подход слишком прост, потому что я думаю, что у людей разного размера скелет распознается по-разному, поэтому сравнение не является надежным.

Мой вопрос - это лучший способ сравнить сохраненное движение с выполненным движением (на лету).

PS: Извините, мой английский.

4b9b3361

Ответ 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, поэтому моя текущая программа выглядит примерно так: image

ИЗМЕНИТЬ

Это концепция раскрашивания двух движений с кинцетом и вычисления сходства между двумя движениями, которые я подробно объясняю.

Предположим, что у меня есть следующие 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. Иначе это не сработает. Надеюсь, что это поможет.

Ответ 2

Прежде всего помните, что люди разные. Каждый человек имеет разную высоту, ширину, вес, различную длину кости и т.д. И т.д.

Код, вероятно, никогда не будет работать из-за этого.

Во-вторых, вам нужно думать более геометрически. Не думайте только о точках, думайте с помощью векторов, их направлений. Каждое движение движется от некоторых векторов в некоторых направлениях. Затем пропорция. Вам нужно настроить приложение для каждого пользователя.

У вас есть образец. Пэттер - ваш физиотерапевт. Вы должны помнить не только его движения, но и его тело. Длина руки, длина ноги, дистанции и т.д. Каждый пользователь, который будет использовать ваше приложение, также должен меня замерить. Имея все эти данные, вы можете сравнить движение, масштабируя размеры и сравнивая направления движения

Конечно, помните, что есть некоторые очень простые движения, например, например. Их можно распознать простой математикой, проверяя фактическое положение руки и проверяя направление движения. Вам нужны три контрольных точки, и вы дома:)

распознавание жестов не просто вещь