使用Kinect在OpenGL中将多个纹理/帧粘贴在一起

使用Kinect在OpenGL中将多个纹理/帧粘贴在一起,opengl,graphics,3d,kinect,Opengl,Graphics,3d,Kinect,我遇到了以下情况: 我有一个Kinect相机,我一直在拍摄照片(但只有当用户按下一个键时,照片才会被存储) 我使用库来检索帧的深度和颜色(我对骨架跟踪或类似的东西不感兴趣) 对于单个帧,我使用freenect附带的glpclview示例 从Kinect传感器检索空间数据后,在glpclview示例中,当前帧的绘制方式如下: glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_SHORT, 0, xyz); glEnableCli

我遇到了以下情况:

  • 我有一个Kinect相机,我一直在拍摄照片(但只有当用户按下一个键时,照片才会被存储)
  • 我使用库来检索帧的深度和颜色(我对骨架跟踪或类似的东西不感兴趣)
  • 对于单个帧,我使用freenect附带的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]=i xyz[i][j]=深度[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(帧数)的连续指针

    为了得到一个更好的想法,我试图最终得到类似的东西(除了机器人:D)


    如果有人有更好的想法,请提示我如何处理这个问题,请让我知道

    这并不像分配一个更大的数组那么简单


    如果您想将多个点云缝合在一起以制作更大的地图,您应该研究SLAM算法(这就是它们在您链接到的视频中运行的算法)。您可以在中找到许多实现。您还可以研究ICP算法(迭代最近点)和Microsoft的KinectFusion(以及PCL的开源KinFu实现)。

    非常感谢您,先生!它给了我一个起点!我在这里还遇到了另一个有趣的解决方案: