2011-11-25 84 views
2

背景:比较Kinect的深度到OpenGL的深度有效

此问题与对象的3D跟踪有关。我的系统将已知参数(X,Y,Z)中的对象/样本投影到OpenGL,并尝试与从Kinect传感器获得的图像和深度信息进行匹配,以推断对象的3D位置。

问题:

Kinect的深度 - >流程 - >以毫米为单位值

OpenGL->深度buffer->值之间0-1

(其是非线性远近之间映射)

尽管我可以使用http://www.songho.ca/opengl/gl_projectionmatrix.html上提到的方法从OpenGL恢复Z值,但这会产生非常慢的性能。

我相信这是常见的问题,所以我希望一定存在一些切肉刀解决方案。

问:

有效的方式来恢复眼睛z的OpenGL的坐标?

或者有没有其他解决上述问题的方法?

+0

看看OpenCV。我还没有将它与OpenGL一起使用,但OpenCV几乎可以实时完成大部分操作。 – Blender

+0

@Blender:你可以指点我的文档...我也在那里搜索,但没有运气。谢谢! – Rudi

+0

看看[这里](http://opencv.willowgarage.com/wiki/Kinect)。 – Blender

回答

2

现在我的问题是Kinect的深度在毫米

不,事实并非如此。 Kinect报告它的深度为任意单位的11位范围内的值。只有在应用了一些校准之后,才能将深度值解释为物理单位。你说得对,OpenGL透视投影深度值是非线性的。

所以如果我正确理解你,你想通过检索深度缓冲区的内容来模拟Kinect,对吧?然后,最简单的解决方案是使用顶点和片段着色器的组合,其中顶点着色器将线性深度作为片段着色器的附加变化传递,然后片段着色器用传递的值覆盖片段的深度值。 (你也可以为此使用额外的渲染目标)。

另一种方法是使用投影到场景深度范围内的1D纹理,其中纹理值对深度值进行编码。然后所需的值将在颜色缓冲区中。