2011-11-03 62 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]