在Kinect SDK v2.0中,如何将彩色图像中的像素映射到深度图像中的体素?

时间:2014-04-01 22:34:31

标签: kinect

我知道如何走另一条路。我正在寻找的是,给定像素空间(1920x1080图像)中的(x,y)坐标,如何获得深度的相应(如果可用)(x,y,z)(以米为单位)图片。我意识到像素比体素多,有可能找不到任何像素,但微软的SDK有一个 CoordinateMapper 类。这暴露了 MapColorFrameToCameraSpace 功能。如果我使用它,我可以在相机空间(x,y,z)中获得一系列点,但我无法弄清楚如何提取特定像素的映射。

1 个答案:

答案 0 :(得分:1)

您可能需要使用

  

CoordinateMapper.MapDepthFrameToColorSpace

找到所有深度点的颜色空间坐标。 然后,将您的像素坐标(x,y)与这些颜色空间坐标进行比较。我的解决方案是找到最近的点(可能有更好的方法),因为映射的坐标是浮点数。

如果您使用C#,这是代码。希望它有所帮助!

private ushort GetDepthValueFromPixelPoint(KinectSensor kinectSensor, ushort[] depthData, float PixelX, float PixelY)
    {
        ushort depthValue = 0;
        if (null != depthData)
        {
            ColorSpacePoint[] depP = new ColorSpacePoint[512 * 424];

            kinectSensor.CoordinateMapper.MapDepthFrameToColorSpace(_depthData, depP);

            int depthIndex = FindClosestIndex(depP, PixelX, PixelY);

            if (depthIndex < 0)
                Console.WriteLine("-1");
            else
            {
                depthValue = _depthData[depthIndex];
                Console.WriteLine(depthValue);
            }
        }
        return depthValue;
    }

    private int FindClosestIndex(ColorSpacePoint[] depP, float PixelX, float PixelY)
    {
        int depthIndex = -1;
        float closestPoint = float.MaxValue;
        for (int j = 0; j < depP.Length; ++j)
        {
            float dis = DistanceOfTwoPoints(depP[j], PixelX, PixelY);
            if (dis < closestPoint)
            {
                closestPoint = dis;
                depthIndex = j;
            }
        }
        return depthIndex;
    }

    private float DistanceOfTwoPoints(ColorSpacePoint colorSpacePoint, float PixelX, float PixelY)
    {
        float x = colorSpacePoint.X - PixelX;
        float y = colorSpacePoint.Y - PixelY;
        return (float)Math.Sqrt(x * x + y * y);
    }