2011-11-03 44 views
0

我正在與Kinect合作,並試圖深入研究數據並對其進行處理。翻轉存儲在F#中的一維數組中的二維「圖像」

本質上,當我處理來自Kinect的深度框架時,我想保存2個球員和背部的前部深度數據。然後我需要翻轉後面的數據,以便它可以用來建立玩家的3D模型。

我遇到的問題是將這些數據反轉回來。

我有一個長度爲1D的數組(長度爲320 * 240 = 76800)的深度數據,我打算翻轉每行(320個陣列中的位置)來翻轉圖像。

let mutable flipped = Array.create (320*240) 0 
for y=0 to 239 do 
    for x=0 to 319 do 
     let n = ((y)* 320 + x) 
     flipped.[n] <- depths.[(320*(y+1))-(n+1)] 

System.Diagnostics.Debug.WriteLine("DepthsMax:" + Array.max(depths).ToString()) 
System.Diagnostics.Debug.WriteLine("FlippedMax:" + Array.max(flipped).ToString()) 

深度數組包含我試圖翻轉的數據,但是,此代碼使翻轉的數組完全由0組成。

任何人都可以發現我做錯了什麼嗎?

感謝

+2

對於數組,'mutable'使基準可變的。元素是_always_ mutable。所以在這種情況下沒有必要 – Daniel

+2

您可以用'Array.zeroCreate _'替換'Array.create _ 0'。 – Daniel

+0

啊感謝提示傢伙,仍然試圖抓住f#!非常有用謝謝 –

回答

4

首先,請注意,您不需要爲flipped是可變的,因爲你永遠不將其重新分配(僅修改它)。

談到問題本身。鑑於n = 320*y + x,你在看指數:

320 * (y+1) - n - 1 
= 320 * y + 320 - (320 * y + x) - 1 
= 319 - x 

因此,你永遠只能從第一行訪問數據。您希望訪問索引y*320 + (319-x)320*(y+1) - (x+1),而不是320*(y+1) - (n+1)

+0

太好了,非常感謝。我始終認爲,編程中最難的問題(對我來說)是幾天來一直盯着你說服你自己不能看到錯誤的愚蠢錯誤!謝謝。 –

1

如果我理解正確的話,行標號不變並且在每行數據應該相反:

for row=0 to 239 do 
    for col=0 to 319 do 
    flipped.[320*row+col] <- depths.[320*row+319-col]