我正在尝试在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。有什么猜测?我错过了一些明显的东西吗?
答案 0 :(得分:1)
for (var index = 0; index < depthData.Length; index++) {
int u = (int) Math.Floor(colorPoints[index].X);
int v = (int) Math.Floor(colorPoints[index].Y);
/*
1. not every depth pixel has a corresponding color pixel.
So always check whether u,v are valid or not
*/
if ((0 <= u) && (u < colorWidth) && (0 <= v) && (v < colorHeight)) {
/*
2. now u,v are pixel coordinates in colorspace,
so to get the index of the corresponding pixel,
you need to multiply v by colorWidth instead of depthwidth
*/
int pixelsBaseIndex = v * colorWidth + 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];
}
}
如果您需要更多参考,请检查以下内容,这是C ++中另一种注册实现。但你可以理解这个概念。
令人惊讶的是,最低指数为-2147483648。有什么猜测吗?
如果检查原始深度帧的值,您会发现一些无效的深度值。 Kinect v2的深度范围为0.5m至4.5m。超出此范围的所有对象都会导致深度值无效。这些值导致-2147483648。您可以预处理这些无效值,也可以忽略它们。
答案 1 :(得分:0)
试试这个
bool flag = true;
for (int i = 1; (i <= ((depthData.Length)- 1)) && flag; i++)
{
flag = false;
for (int j = 0; j < ((depthData.Length)- 1); j++)
{
//You Statements Goes here
flag = true;
}