C# 索引超出了Kinect v2中数组的边界

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

我正在尝试获取Kinect v2中每个CameraSpacePoint的RGB值。我能够获取CameraSpacePoints和彩色像素。但在我的代码中,从CameraSpacePoints到彩色像素的映射似乎被破坏了,这导致了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];
}
为了调试该问题,我监控了每个索引,然后计算了最小和最大索引值,如下所示:

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;(i
for(var index=0;indexif((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];
     }


   }