2017-11-23 22 views
1

Kinect v2の各CameraSpacePointのRGB値を取得しようとしています。私はCameraSpacePointsとColorピクセルを取得することができます。しかし、CameraSpacePointからColorピクセルへのマッピングが私のコードで壊れているようで、IndexOutOfRangeExceptionにつながっているようです。インデックスがKinect v2の配列境界外にありました

データ収集部分を示す以下のコードを参照してください。

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. 

問題をデバッグするために、 nは以下のように最小値と最大インデックス値を計算:

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

[何がjava.lang.ArrayIndexOutOfBoundsExceptionを引き起こし、どのように防止するのですか?](https://stackoverflow.com/questions/5554734/what-c​​auses-a-java-lang-arrayindexoutofboundsexception-and-どのように - 私 - 防止 - それ) – Progman

答えて

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]; 
    } 


    } 

を試してみてください。あなたはその概念を理解することができます。

Kinect Registration

Surprisingly the minimum index is -2147483648. Any guess?

あなたは生の深さフレームの値を確認する場合は、いくつかの無効な深度値を検索します。 Kinect v2の深さ範囲は0.5m〜4.5mです。この範囲外のオブジェクトはすべて無効な深度値になります。これらの値により、-2147483648が発生します。これらの無効な値を前処理したり、無視したりすることができます。

+0

ありがとうございます。浮動小数点演算の結果、範囲外のインデックスが生成されましたが、固定されています。 –

0

は、あなたがより多くの参照が必要な場合は、次のことを確認してください、それは、C++での登録の別の実装であるこの

 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; 

      } 
+0

これはあまり面白いではありません。私は次のようにするのがよいでしょう: 'int pixelsBaseIndex =(int)(v * depthWidth + u); if pixelsBaseIndex <0: 続行; ' –

+0

それをどのように管理するか。 –

関連する問題