C# 索引超出了Kinect v2中数组的边界
我正在尝试获取Kinect v2中每个CameraSpacePoint的RGB值。我能够获取CameraSpacePoints和彩色像素。但在我的代码中,从CameraSpacePoints到彩色像素的映射似乎被破坏了,这导致了IndexOutOfRangeException 请参阅下面显示数据收集部分的代码片段:C# 索引超出了Kinect v2中数组的边界,c#,kinect-v2,C#,Kinect V2,我正在尝试获取Kinect v2中每个CameraSpacePoint的RGB值。我能够获取CameraSpacePoints和彩色像素。但在我的代码中,从CameraSpacePoints到彩色像素的映射似乎被破坏了,这导致了IndexOutOfRangeException 请参阅下面显示数据收集部分的代码片段: var depthWidth = depthFrame.FrameDescription.Width; var depthHeight = depthFrame.FrameDescr
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];
}
为了调试该问题,我监控了每个索引,然后计算了最小和最大索引值,如下所示:
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
List allIndex=new List();
对于(var index=0;index=0))//打印错误
令人惊讶的是,最低指数为-2147483648。猜猜看?我是不是漏掉了什么明显的东西 试试这个
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;
}
bool标志=true;
for(int i=1;(ifor(var index=0;index if((0)这不太有趣。我最好做以下事情:int pixelsBaseIndex=(int)(v*depthWidth+u);if pixelsBaseIndex<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;
}
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];
}
}