Количественная оценка изменения направления по массиву 3d точек - PullRequest
2 голосов
/ 01 июля 2011

Я работаю над программным обеспечением, написанным на Java, которое использует некоторые классы библиотеки processing.core и simpleopenni для отслеживания руки пользователя с помощью XBOX Kinect.

Я пытаюсь понять, как определить, когда движение руки пользователя резко меняет направление.

В моем распоряжении в настоящее время есть массив PVectors (по существу, вектор координат x, y и z: Точка в трехмерном пространстве ), который записывает положение руки пользователя за последние 30 кадры или около того.

Я предполагаю, что должен быть способ получить значение, которое представляет величину изменения направления почти в реальном времени, учитывая самые последние записанные точки. Может подгонять кривую и брать какие-то производные?

В идеале решение не должно быть слишком дорогим в вычислительном отношении, так как я пытаюсь реализовать достойное решение в реальном времени.

Любое направление, которое вы можете предложить, будет высоко оценено!

Ответы [ 2 ]

3 голосов
/ 01 июля 2011

Пусть позиция сейчас (то есть 0 кадров назад) будет (x0, y0, z0)
Пусть позиция n кадров назад будет (xn, yn, zn).
Пусть позиция 2n кадров назад будет (xm, ym, zm).

Тогда изменение положения между кадрами 2n и n равно (xn-xm, yn-ym, zn-zm).
Вы можете думать об этом как о средней скорости в течение этих n кадров.

А изменение положения между n и теперь равно (x0-xn, y0-yn, z0-zn).
Это представляет среднюю скорость в течение следующих n кадров.

Теперь у вас есть скорость для n кадровкоторый закончился n кадров назад, и у вас есть скорость для n кадров, которые только что закончились.

изменение скорости в течение последних n кадров должно бытьРазница между этими двумя векторами.Для каждой координаты:

Ax = (x0-xn) - (xn-xm) = x0 -2xn + xm
Ay = (y0-yn) - (yn-ym) = y0 -2yn + ym
Az = (z0-xn) - (zn-zm) = z0 -2zn + zm

Величина ускорения составляет |A| = sqrt( (Ax)^2 + (Ay)^2 + (Az)^2 )
Если выОтносясь только к «большим» изменениям и предпочитая скорость перед точностью, вы можете уйти с A' = (Ax)^2 + (Ay)^2 + (Az)^2
или даже A" = abs(Ax) + abs(Ay) + abs(Az)

Идея состоит в том, что вы хотите, чтобы каждый компонент вносил свой вклад вцелое, независимо от того, является ли оно положительным или отрицательным, поэтому вы «заставляете» его быть положительным, возводя его в квадрат или принимая его абсолютное значение.

Надеюсь, это поможет!

1 голос
/ 01 июля 2011

Не проще ли было бы рассчитать разность векторов, то есть вычесть одно из другого, и решить, насколько велика разница, достаточно значительная, чтобы судить о ее резком изменении направления.

Это было бы вычислительно недорого.

РЕДАКТИРОВАТЬ: просто чтобы расширить это немного, 2 вектора одинакового направления имеют почти нулевую разность векторов. Два вектора в противоположных направлениях будут иметь большую разность векторов.

, например

 (4,4) - (3,3) = (1,1)
 (4,0) - (0,4) = (4,-4)
 (4,4) - (-4,-4) = (8,8)

(я знаю, что это 2D, но принципы те же.)

...