如何从Kinect SDK C#数据中获取播放器深度

本文关键字:获取 播放器 深度 数据 Kinect SDK | 更新日期: 2023-09-27 18:28:02

做一个团队项目,试图在玩家(特别是玩家)接近/远离时发生一些事情,所以我们编写了这个函数。(我们不允许使用骨架功能)

private void FindDepth(DepthImageFrame depthFrame)
    {
        short[] rawDepthData = new short[depthFrame.PixelDataLength];
        depthFrame.CopyPixelDataTo(rawDepthData);
        Byte[] pixels = new byte[depthFrame.Height * depthFrame.Width * 4];
        for (int depthIndex = 0; depthIndex < rawDepthData.Length; depthIndex++)
        {
            int player = rawDepthData[depthIndex] & DepthImageFrame.PlayerIndexBitmask;
            int depth = rawDepthData[depthIndex] >> DepthImageFrame.PlayerIndexBitmaskWidth;
            if (player > 0)
            {
                playerDepth = rawDepthData[depthIndex];
            }
        }
    }

为什么这不能通过抓取一个像素来正确抓取玩家的深度?

如何从Kinect SDK C#数据中获取播放器深度

深度像素表示为16位。较低的3位提供播放器索引,其余13位提供深度,例如{深度位}{播放器索引位}

{010010111001 0}{010}

因此,为了找到玩家索引,我们通过DepthImageFrame.PlayerIndexBitmask进行AND,如下方所示

(0100 1011 1001 0010)与(0000 0000 0111)=0000 0000 0010=2,即第二玩家

为了找到距离,我们右移3位,返回13位,如下所示0000 1001 0111 0010=2418,即2418 mm

重要的是要记住,只有当骨架跟踪处于启用状态。如果骨架跟踪处于禁用状态,则每个深度中的玩家编号值设置为0。