0

我在事件 sensor_DepthFrameReady 中创建了一个线程,但是当我执行它时,在函数 SetImage1Frame 的第 8 行(Depths[depth]++;)上抛出异常并抛出此异常:

索引超出了数组的范围。(深度 = -1)

出了什么问题?我认为函数(SetImage1Frame)执行了不止一次,但我只在这个方法(sensor_DepthFrameReady)中使用了这个函数!!

    void sensor_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
    {
        short[] pixels;
        Thread th;
        using (frame=e.OpenDepthImageFrame())
        {
            if (frame!=null)
            {
                pixels = new short[frame.PixelDataLength];
                frame.CopyPixelDataTo(pixels);
                th = new Thread(() =>
                    SetImage1Frame(pixels));
                th.Start();
            }
        }     

    }
    int[] Depths=new int[4096];
    int depth=0;
    double chartBarWidth;
    void SetImage1Frame(short[] dpixels)
    {
        int maxValue = 0;
        for (int i = 0; i < dpixels.Length; i++)
        {
            depth = dpixels[i] >> DepthImageFrame.PlayerIndexBitmaskWidth;
            if (depth > 0)
            {
                Depths[depth]++;
            }
        }
        for (int i = 0; i < Depths.Length; i++)
        {
            maxValue=Math.Max(maxValue,Depths[i]);
        }

        for (int i = 0; i < Depths.Length; i++)
        {
            if (Depths[i] > 0)
            {
                stackPanel1.Dispatcher.Invoke(new Action(() =>
                {
                    Rectangle r = new Rectangle();
                    stackPanel1.Children.Add(r);
                }));
            }
        }
        image1.Dispatcher.BeginInvoke(new Action(() =>
        {
            WrbitmapImage.WritePixels(rect, dpixels, stride, 0);
        }));

    }
4

1 回答 1

0

您的代码未正确处理来自 Kinect 的签名号码。这个程序演示了这个问题:-

class Program
{
    static void Main(string[] args)
    {
        short s = unchecked((short)0x8001);
        int i = s >> 3;
        Console.WriteLine(i);
    }
}

该程序将打印 -4096。Kinect 输入作为一个 short 数组提供给您,它是一个有符号类型。当您移开玩家索引时,该数字将被符号扩展并保持为负数。在您的情况下,由于您看到的是-1,因此这可能是深度视图中的一个像素,距离超过 4 米。要解决此问题,您应该在处理之前将深度像素值转换为 ushort 并仅使用无符号类型。

于 2013-09-08T02:59:57.230 回答