MATLAB中的深度缓冲区

时间:2018-04-19 04:27:35

标签: matlab depth-buffer

我正在尝试从MATLAB中的深度缓冲区重建世界坐标,并想知道是否有人可以帮我找出一种方法从MATLAB中的渲染图像中获取深度缓冲区值,因为没有内置函数可以完成这个。

1 个答案:

答案 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);

我希望这会有所帮助。