Количественное изменение направления с учетом массива трехмерных точек

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

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

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

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

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

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


person Dream Lane    schedule 01.07.2011    source источник
comment
Верно ли предположить, что время кадра постоянно?   -  person Charles Goodwin    schedule 01.07.2011
comment
@Чарльз Гудвин: они не постоянны, но они изменяются настолько незначительно, что я думаю, мы можем считать их постоянными.   -  person Dream Lane    schedule 01.07.2011


Ответы (2)


Пусть позиция сейчас (то есть 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).

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

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

person Adam Liss    schedule 01.07.2011

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

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

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

e.g.

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

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

person Charles Goodwin    schedule 01.07.2011
comment
Я пытаюсь немного поразмыслить над этим... Но мои векторы на самом деле представляют собой только точки в трехмерном пространстве, поэтому, чтобы увидеть изменение направления, не придется ли мне выполнять некоторые математические операции как минимум с 3 точками? Извините, если я не совсем ясно описал PVectors. я отредактировал сообщение - person Dream Lane; 01.07.2011