使用Kinect在OpenGL中拼接多个纹理/帧

时间:2012-02-13 01:06:41

标签: opengl graphics 3d kinect

我遇到了以下情况:

  1. 我有一个Kinect相机,我一直拍摄帧(但只有当用户按下键时才存储它们)。
  2. 我正在使用freenect库来检索框架的深度和颜色(我对骨架跟踪或其类似的东西不感兴趣)。
  3. 对于单帧,我使用的是freenect library
  4. 附带的glpclview示例

    从Kinect传感器中检索空间数据后,在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 =深度[i * 640 + j]

    • indices 是(我猜只有)跟踪rgb /深度数据的数组,构造如下:

      indices [i] [j] = i * 640 + j

    到目前为止,这么好,但现在我需要渲染更多只有一帧(其中一些旋转并以一定的角度/偏移进行平移)。我怎样才能做到这一点? 我试图增加数组的大小并为每个新帧保留重新分配内存,但是我如何渲染它们呢? 我应该将此当前行更改为其他内容吗?

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

    如果是这样,我应该更改640和480,因为现在 xyz rgb 是640x480x(帧数)的contiguos指针?

    为了获得更好的想法,我最终尝试得到类似于this的东西(除了机器人:D)。

    如果有人有更好的想法,请提示我应该如何处理这个问题,请告诉我。

1 个答案:

答案 0 :(得分:1)

它并不像分配更大的数组那么简单。

如果您想将多个点云拼接在一起以制作更大的地图,您应该查看SLAM算法(这是他们在您链接的视频中运行的算法)。您可以在http://openslam.org找到许多实现。您还可以查看ICP算法(迭代最近点)和Microsoft的KinectFusion(以及PCL的开源KinFu实现)。