我正在尝试从MATLAB中的深度缓冲区重建世界坐标,并想知道是否有人可以帮我找出一种方法从MATLAB中的渲染图像中获取深度缓冲区值,因为没有内置函数可以完成这个。
答案 0 :(得分:0)
似乎最好的方法是通过MEX接口进行openGL函数调用。感谢Twerdster,他为此编写了一个跨平台的MEX文件。
#include "mex.h"
#define GL_VIEWPORT 0x0BA2
#define GL_DEPTH_COMPONENT 0x1902
#define GL_FLOAT 0x1406
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
int viewport[4], i, x, y;
int colLen;
float *data;
double *matrix;
glGetIntegerv(GL_VIEWPORT, viewport);
data = (float*)malloc(viewport[2] * viewport[3] * sizeof(float));
glReadPixels(0, 0, viewport[2], viewport[3], GL_DEPTH_COMPONENT, GL_FLOAT, data);
plhs[0] = mxCreateNumericMatrix(viewport[3], viewport[2], mxDOUBLE_CLASS, mxREAL);
matrix = mxGetPr(plhs[0]);
colLen = mxGetM(plhs[0]);
for(x = 0; x < viewport[2]; ++ x) {
for(y = 0; y < viewport[3]; ++ y)
matrix[x * colLen + y] = data[x + (viewport[3] - 1 - y) * viewport[2]];
}
free(data);
return;
}
我得到的唯一错误是找不到glReadPixels和glGetIntegerv标识符
这很可能是因为在编译期间未正确链接库。
假设您正在使用此MEX文件(compilation将与您编写的任何其他MEX的方法相同);编译此MEX文件打开MATLAB命令提示符/终端并输入以下命令(假设您已将MEX文件保存为 getDepth.c ):
视窗:
mex getDepth.c "path to OpenGL32.lib"
Unix的:
mex getDepth.c "path to opengl32.a"
这会将此C代码编译成MEX可调用函数,以便在MATLAB中运行。 例如:
depthData=getDepth;
figure
imshow(depthData);
我希望这会有所帮助。