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