2

我正在开发一个用 Java 编写的软件,它使用一些 processing.core 库类和 simpleopenni 来使用 XBOX Kinect 跟踪用户的手。

我想弄清楚的是如何确定用户的手部运动何时突然改变方向。

我目前拥有的是一组 PVectors(本质上是 x、y 和 z 坐标的向量:3d 空间中的一个点),记录用户在过去 30 帧左右的手部位置。

我想必须有一种方法可以在给定最近记录的几个点的情况下获得表示几乎实时的方向变化量的值。也许拟合曲线并采取一些导数?

理想情况下,该解决方案在计算上不应该非常昂贵,因为我正在尝试实现一个实时有价值的解决方案。

您可以提供的任何方向将不胜感激!

4

2 回答 2

3

设现在位置(即 0 帧前)为(x0, y0, z0)
n帧前位置为(xn, yn, zn)
2n帧前的位置为(xm, ym, zm)

然后帧之间的位置变化2nn(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)

这个想法是,您希望每个组件都对整体做出贡献,无论它是正面的还是负面的,因此您可以通过平方或取其绝对值来“强制”它为正面。

希望有帮助!

于 2011-07-01T02:07:24.380 回答
1

不是最简单的方法是计算矢量差异,即从另一个中减去一个,并确定差异有多大,足以判断它是方向的突然变化。

那在计算上会很便宜。

编辑:只是为了扩展一点,两个方向相似的向量具有接近零的向量差。两个相反方向的向量会有很大的向量差。

例如

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

(我知道那是二维的,但原理是一样的。)

于 2011-07-01T01:42:56.903 回答