簡體   English   中英

嘗試從C#中的Kinect v2獲取顏色值時出現IndexOutOfRange異常

[英]IndexOutOfRange Exception while trying to get color values from Kinect v2 in C#

我正在嘗試獲取Kinect v2中每個CameraSpacePoint的RGB值。 嘗試訪問轉換的幀數據時,代碼將拋出IndexOutOfRangeException 我發現以下幾行引發此錯誤:

byte red   = pixels[4 * pixelsBaseIndex + 0];
byte green = pixels[4 * pixelsBaseIndex + 1];
byte blue  = pixels[4 * pixelsBaseIndex + 2];
byte alpha = pixels[4 * pixelsBaseIndex + 3];

請查看下面的完整代碼:

int depthWidth = kinectSensor.DepthFrameSource.FrameDescription.Width;
int depthHeight = kinectSensor.DepthFrameSource.FrameDescription.Height;
int colorWidth = kinectSensor.ColorFrameSource.FrameDescription.Width;
int colorHeight = kinectSensor.ColorFrameSource.FrameDescription.Height;

ushort[] depthData = new ushort[depthWidth * depthHeight];
CameraSpacePoint[] cameraPoints = new CameraSpacePoint[depthData.Length];
ColorSpacePoint[] colorPoints = new ColorSpacePoint[depthData.Length];

// Assuming RGBA format here
byte[] pixels = new byte[colorWidth * colorHeight * 4];

depthFrame = multiSourceFrame.DepthFrameReference.AcquireFrame();
colorFrame = multiSourceFrame.ColorFrameReference.AcquireFrame();

if ((depthFrame == null) || (colorFrame == null))
{
    return;
}

depthFrame.CopyFrameDataToArray(depthData);
coordinateMapper.MapDepthFrameToCameraSpace(depthData, cameraPoints);
coordinateMapper.MapDepthFrameToColorSpace(depthData, colorPoints);

// We are using RGBA format
colorFrame.CopyConvertedFrameDataToArray(pixels, ColorImageFormat.Rgba);

for (var index = 0; index < depthData.Length; index++)
{
    var u = colorPoints[index].X;
    var v = colorPoints[index].Y;

    if (u < 0 || u >= colorWidth || v < 0 || v >= colorHeight) continue;

    int pixelsBaseIndex = (int)(v * colorWidth + u);
    try
    {
        byte red = pixels[4 * pixelsBaseIndex + 0];
        byte green = pixels[4 * pixelsBaseIndex + 1];
        byte blue = pixels[4 * pixelsBaseIndex + 2];
        byte alpha = pixels[4 * pixelsBaseIndex + 3];
    }
    catch (IndexOutOfRangeException ex)
    {
        int minValue = 4 * pixelsBaseIndex;
        int maxValue = 4 * pixelsBaseIndex + 3;
        Console.WriteLine((minValue > 0) + ", " + (maxValue < pixels.Length));
    }
}

代碼看起來不錯,但是我不確定這里缺少什么! 如何避免IndexOutOfRangeException異常? 有什么建議嗎?

第一件事pixelsBaseIndex =< 2070601 (2070601 = 1919 * 1079)

2074817是針對一個無效值pixelsBaseIndex

此錯誤可能在此處。

if (u < 0 || u >= colorWidth || v < 0 || v >= colorHeight) continue;

int pixelsBaseIndex = (int)(v * colorWidth + u);

最好的辦法是控制台記錄u, v, colorWidth, colorHeight並驗證它們。

編輯

如我所懷疑,這是由浮點運算法則引起的。 將一幀映射到另一幀需要復雜的矩陣計算,因此u,v獲得浮點值。 請記住, u,v是色彩空間的像素坐標 它們必須是非負整數。

我推薦的解決方案是

...
    int u = (int) Math.Floor(colorPoints[index].X);
    int v = (int) Math.Floor(colorPoints[index].Y);

    if (u < 0 || u >= colorWidth || v < 0 || v >= colorHeight) continue;
...

FYI

查看以下代碼行,以了解為什么u,v像素坐標獲取浮點值。 決定發言還是放棄無效值取決於開發人員,因為在這兩種情況下,您都會丟失某種信息。 例如,占地表示您正在獲取最近像素的顏色。

在我個人的選擇中,輸出更精確的值(因此是浮點值)對於對輸出值進行更多計算的開發人員很重要,例如,點雲注冊。

depth_to_color

根據深度值計算rgb圖像的x偏移

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM