我正在使用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传感器的骨架。
在Skeleton Space中,Z是距离Kinect传感器的距离(参见here)。
如果你想到房间被分成左半部分和右半部分,通过Kinect传感器的一条线......那么X就是离那条线有多远的距离。向左或向右多远。
这也是使用X的绝对值的原因 - 代码看起来Skeleton距离假设的分界线有多远。
所以这段代码看起来身体离传感器有多远(Z),然后将它与左或右(X)的距离相乘。这是一种有点原始的距离决定。 (人们本来期望使用毕达哥拉斯定理,但也许这被认为太慢了?)
代码采用FirstOrDefault
Skeleton,其中这些Skeletons按此距离度量排序。
s => s.Position.Z * Math.Abs(s.Position.X)
在OrderBy语句中,作为订购所有检测到的物体的数量。它通过径向距离对骨架进行加权,而不仅仅是正交Z分离。
考虑同一z坐标处的两个对象和原点处的摄像机。最接近的是具有较小水平(x)距离的那个。