2012-02-13 53 views
0

的OpenGL我遇到以下情況傳來:拼接的多重紋理/一起幀使用Kinect的

  1. 我有一個Kinect的攝像頭和我繼續服用幀(但只有當用戶按下一個鍵將它們存儲) 。
  2. 我使用freenect庫來檢索框架的深度和顏色(我對骨架跟蹤或類似的東西不感興趣)。
  3. 對於我使用隨附freenect library

從Kinect傳感器檢索所述空間數據,在glpclview例如後glpclview例的單個幀,當前幀就被繪製這樣的:

glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3, GL_SHORT, 0, xyz); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glTexCoordPointer(3, GL_SHORT, 0, xyz); 

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, gl_rgb_tex); 
glTexImage2D(GL_TEXTURE_2D, 0, 3, 640, 480, 0, GL_RGB, GL_UNSIGNED_BYTE, rgb); 

glPointSize(2.0f); 
glDrawElements(GL_POINTS, 640*480, GL_UNSIGNED_INT, indices); 

其中

static unsigned int indices[480][640]; 
static short xyz[480][640][3]; 
char *rgb = 0; 
short *depth = 0; 

其中:

  • RGB是對於當前幀的顏色信息
  • 深度
  • XYZ被構造爲用於當前幀的深度信息:

    XYZ [i] [j ] [0] = j xyz [i] [j] 3 = i xyz [i] [j] 4 = depth [i * 640 + j]

  • 指數是(我想只)陣列上保持RGB /深度數據的軌道和構成爲:

    指數爲[i] [j] = I * 640 + J

到目前爲止,這麼好,但現在我需要渲染更多,只有一個框架(其中一些旋轉和翻譯一定的角度/偏移量)。我怎樣才能做到這一點? 我曾嘗試增加數組的大小併爲每個新幀保留重新分配內存,但是如何渲染它們? 我應該改變這個當前行到其他?

glTexImage2D(GL_TEXTURE_2D, 0, 3, 640, 480, 0, GL_RGB, GL_UNSIGNED_BYTE, rgb) 

如果是這樣,什麼值應該更改640和480,因爲現在XYZRGB是640x480x一個contiguos指針(幀數)?

爲了得到更好的ideea,我試圖在最後得到類似於this的東西(機器人除外:D)。

如果有人有更好的想法,提示我應該如何處理這個問題,請讓我知道。

回答

1

這不像分配更大的數組那麼簡單。

如果您想將多個點雲拼接在一起製作更大的地圖,您應該查看SLAM算法(這是他們在視頻中運行的鏈接)。您可以在http://openslam.org找到許多實現。您也可以查看一下ICP算法(Iterative Closest Point)和Microsoft的KinectFusion(以及PCL的開源KinFu實現)。

+0

非常感謝您的先生!它給了我一個起點!另外我還遇到了另一個有趣的解決方案:http://manctl.com/products.html – 2012-02-13 18:47:22