2013-10-18 108 views
0

我的Kinect將安裝在直接向下看地面的天花板上(應平行於地面)。對於物體識別,我想獲得到地面的距離(maxDistance)和到物體的距離(minDistance)。 我寫了一個循環,將每個像素的所有距離值添加到列表中,然後嘗試獲取該列表的最大整數和最小值。從Kinect獲得最大和最小深度

不幸的是,對於zMIN和zMAX的結果(我寫信給一個文本框來檢查它)總是一樣的 - 這肯定是錯誤的。

問題:我在做什麼錯? :)

List<int> tiefe = new List<int>(); 

     for (var y = 0; y < height; y++) 
     { 

      for (var x = 0; x < width; x++) 
      { 

       var distance = GetDistance(depthdata[depthIndex], depthdata[depthIndex + 1]); 
       tiefe.Add(distance); 
       depthIndex += 2; 
      } 
     } 
     var zMAX = tiefe.Max(); 
     var zMin = tiefe.Min(); 
+0

雅我的意思是應該返回的最小值和最大值。當你到達那一點時,你的名單上有什麼? –

回答

2

如果你只需要最小/最大,並且depthData是16位深度值的字節數組,這將是更容易和更快:

int min = int.MaxValue, max = int.MinValue; 
for(int i = 0; i < depthData.Length; i += 2) 
{ 
    int dist = GetDistance(depthData[i], depthData[i + 1]); 
    if(dist < min) min = dist; 
    if(dist > max) max = dist; 
} 

使用depthIndex變量似乎在其他地方宣佈看起來很危險。而這個清單只是多餘的!

+0

好的,我明白了。我現在使用這樣的循環代碼http://stackoverflow.com/questions/19274287/creating-a-bitmap-of-depth-data-where-color-shows-the-distance-c-sharp,但仍然輸出是兩個完全相同的數字。 –

+0

您仍然有'depthdata [depthIndex]',而您的計算索引只被稱爲'index'。錯字? – Chris

+0

在另一個循環中(即我在評論中鏈接)索引僅用於使用某種顏色爲新的顏色着色。所以在這種情況下,我實際上甚至不需要它。我現在很困惑,爲什麼我在循環中不使用x和y而使用循環。不過現在,我現在得到了zMax的結果,這對於zMin來說似乎是合法的,並且始終爲0。 –

0

爲了計算zMax,您可以搜索深度數據數組中的最大值,但要計算zMin,必須搜索大於FLT_EPSILON(= 1.192092896e-07f)的最小值。實現你需要使用J4K Java for Kinect library正是代碼如下:

public void onDepthFrameEvent(short[] packed_depth, int[] U, int V[]) { 
    DepthMap map=new DepthMap(depthWidth(),depthHeight(),packed_depth); 
    float zMIN=4;//The largest possible value 
    float zMAX=0;//The smallest possible value 
    for(int i=0;i<map.realZ.length;i++) 
    { 
     if(zMAX<map.realZ[i]) zMAX=map.realZ[i]; 
     if(map.realZ[i]>DepthMap.FLT_EPSILON && zMIN>map.realZ[i]) zMIN=map.realZ[i]; 
    } 

} 
+0

謝謝你的答案,無論我我有義務使用C#,並且由於我以前的kinect,我也必須使用beta sdk 2.但是,您是對的,我需要大於0的zMIN(因爲0是所有點的值太遠或太接近。) –

+0

不用謝。作爲次要評論,測試> 0與測試> FLT_EPSILON稍有不同,後者在Microsoft的所有Kinect SDK示例中都有使用。 –