我正在开发一个用Java编写的软件,它使用一些processing.core库类和simpleopenni来跟踪用户的XBOX Kinect。
我想弄清楚的是如何确定用户的手部动作何时突然改变方向。
我目前拥有的是一系列PVectors(基本上是x,y和z坐标的矢量: 3d空间中的一个点),用于记录用户过去的手位置30帧左右。
我认为必须有一种方法可以获得一个代表最近记录的几个点的近乎实时的方向变化量的值。也许适合曲线并采取一些衍生物?
理想情况下,解决方案的计算成本不应太高,因为我正在尝试实施一个实时有价值的解决方案。
非常感谢您提供的任何方向!
答案 0 :(得分:3)
现在让位置(即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 :(得分:1)
最简单的方法是不是计算出矢量差异,即从另一个中减去一个,并确定差异有多大,足以判断它是一个突然的方向变化。
这在计算上很便宜。
编辑:只是为了扩展一点,相似方向的2个矢量具有接近零的矢量差异。相反方向的两个向量将具有较大的向量差异。
e.g。
(4,4) - (3,3) = (1,1)
(4,0) - (0,4) = (4,-4)
(4,4) - (-4,-4) = (8,8)
(我知道这是2D,但原则是相同的。)