量化给定 3d 点数组的方向变化

Posted

技术标签:

【中文标题】量化给定 3d 点数组的方向变化【英文标题】:Quantify a change of direction given an array of 3d points 【发布时间】:2011-07-01 01:34:06 【问题描述】:

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

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

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

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

理想情况下,该解决方案的计算成本不应很高,因为我正在尝试实现一个具有实时价值的解决方案。

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

【问题讨论】:

假设帧时间不变是否准确? @Charles Goodwin:它们不是恒定的,但它们的变化很小,我认为我们可以假设它们是恒定的 【参考方案1】:

设现在(即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 + xmAy = (y0-yn) - (yn-ym) = y0 -2yn + ymAz = (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)

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

希望有帮助!

【讨论】:

【参考方案2】:

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

这在计算上会很便宜。

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

例如

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

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

【讨论】:

我正在尝试对此进行一些解释......但我的“向量”实际上只表示 3d 空间中的点,所以要看到方向的变化,我不需要执行一些数学运算至少3分?抱歉,如果我不清楚我对 PVectors 的描述。我已经编辑了帖子

以上是关于量化给定 3d 点数组的方向变化的主要内容,如果未能解决你的问题,请参考以下文章

梯度下降,向量化,广播

以矢量化方式连接给定开始,停止数字的范围数组 - NumPy

如何矢量化 numpy 数组的 2x2 子数组的平均值?

3D模型轻量化处理教程Blender

MATLAB 向量化:计算邻域矩阵

3D轻量化引擎推出新技术,模型渲染更逼真!