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



我遇到了以下情况:

  1. 我有一台Kinect相机,我一直在拍照(但只有当用户按下键时,它们才会被存储)
  2. 我使用freenect库来检索帧的深度和颜色(我对骨骼跟踪或类似的东西不感兴趣)
  3. 对于单个框架,我使用的是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是当前帧的颜色信息
  • depth是当前帧的深度信息
  • xyz构造为:

    xyz[i][j][0]=jxyz[i][j]3=ixyz[i][j]4=深度[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算法(这就是它们在你链接的视频中运行的算法)。您可以在http://openslam.org.你也可以看看ICP算法(迭代最近点)和微软的KinectFusion(以及PCL的开源KinFu实现)。

最新更新