我正在尝试获取 Kinect v2 中每个 CameraSpacePoint 的 RGB 值。我能够获取 CameraSpacePoints 和 Color 像素。但似乎从 CameraSpacePoints 到 Color 像素的映射在我的代码中被破坏了,这导致我出现 IndexOutOfRangeException。
请参阅下面显示数据收集部分的代码片段:
var depthWidth = depthFrame.FrameDescription.Width;
var depthHeight = depthFrame.FrameDescription.Height;
ushort[] depthData = new ushort[depthWidth * depthHeight];
var colorWidth = colorFrame.FrameDescription.Width;
var colorHeight = colorFrame.FrameDescription.Height;
byte[] pixels = new byte[colorWidth * colorHeight * 4];
CameraSpacePoint[] cameraSpacePoints = new CameraSpacePoint[depthData.Length];
ColorSpacePoint[] colorSpacePoints = new ColorSpacePoint[depthData.Length];
depthFrame.CopyFrameDataToArray(depthData);
coordinateMapper.MapDepthFrameToCameraSpace(depthData, cameraSpacePoints);
coordinateMapper.MapDepthFrameToColorSpace(depthData, colorSpacePoints);
// Assuming RGBA format here
colorFrame.CopyConvertedFrameDataToArray(pixels, ColorImageFormat.Rgba);
请参阅下面显示 ColorSpacePoints 的 RGB 值的代码:
for (var index = 0; index < depthData.Length; index++)
{
var u = colorSpacePoints[index].X;
var v = colorSpacePoints[index].Y;
int pixelsBaseIndex = (int)(v * depthWidth + u);
byte red = pixels[4 * pixelsBaseIndex + 0];
byte green = pixels[4 * pixelsBaseIndex + 1];
byte blue = pixels[4 * pixelsBaseIndex + 2];
byte alpha = pixels[4 * pixelsBaseIndex + 3];
}
上面的代码片段抛出以下错误:
IndexOutOfRangeException: Index was outside the bounds of the array.
为了调试这个问题,我监控了每个索引,然后计算了最小和最大索引值,如下所示:
List<int> allIndex = new List<int>();
for (var index = 0; index < depthData.Length; index++)
{
var u = colorpoints[index].X;
var v = colorpoints[index].Y;
int pixelsBaseIndex = (int)(v * depthWidth + u);
allIndex.Add(pixelsBaseIndex);
}
var maxIndex = allIndex.Max();
var minIndex = allIndex.Min();
Console.WriteLine(minIndex);//Prints -2147483648
Console.WriteLine((maxIndex < pixels.Length) && (minIndex >= 0));//Prints False
令人惊讶的是,最小索引是 -2147483648。有什么猜测吗?我在这里遗漏了一些明显的东西吗?