Kinect 应用程序的源代码逆向工程

Source reverse engineering of a Kinect app

我正在开发 Kinect 相机的开源应用程序, 我在阅读源代码时遇到了问题。

顺便说一下,这个项目的想法是用手控制PowerPoint,你可以找到源代码here

作者使用此代码:

Skeleton closestSkeleton = skeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked)
    .OrderBy(s => s.Position.Z * Math.Abs(s.Position.X))
    .FirstOrDefault();

谁能帮我弄清楚是什么s => s.Position.Z * Math.Abs(s.Position.X)

作为一个想法,我知道这是一个 lambda 表达式,所以我只需要弄清楚为什么?

这是一个距离度量,用于确定离 Kinect 传感器最近的骨架。

在骨架Space中,Z是与Kinect传感器的距离(见here)。

如果你认为房间被 Kinect 传感器的一条线分成左半部分和右半部分......那么 X 就是某物与那条线的距离。向左或向右多远。

这也是为什么使用 X 的绝对值的原因 - 代码会查看骨架与假设分界线的距离。

因此,此代码会查看物体离传感器的距离 (Z),然后将其乘以向左或向右的距离 (X)。这是距离的一种有点原始的确定。 (人们本来期望使用勾股定理,但也许这被认为太慢了?)

代码采用 FirstOrDefault 骨架,其中这些骨架按此距离度量排序。

s => s.Position.Z * Math.Abs(s.Position.X) 在 OrderBy 语句中,作为订购所有检测到的物体的数量。它按径向距离对骨架进行加权,而不仅仅是正交 Z 分离。

考虑两个物体在相同的 z 坐标,相机在原点。最近的是水平(x)距离较小的那个。