【问题标题】:Depth Buffer in MATLABMATLAB 中的深度缓冲区
【发布时间】:2018-04-19 04:27:35
【问题描述】:

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

【问题讨论】:

  • 我想您可能正在寻找这个?它使用 openGL 通过 MEX 调用获取深度缓冲区...stackoverflow.com/questions/8862467/…
  • 感谢您的回复。在 MATLAB 无法识别 glGetIntegerv 和 glReadPixels 的意义上似乎存在错误。我应该如何定义它们?
  • 你是如何调用函数的?可以附上代码吗?只是要仔细检查您是在 MEX 文件中从 C/C++ 调用它们还是尝试在 MATLAB 中调用它们(它们不会在 MATLAB 代码中直接被识别)
  • 感谢您的回复。我打电话给他们,正如你发给我的链接上所说的那样(twerdster 创建的代码的较短版本)。很抱歉,我将无法显示代码,因为它是一个研究项目,我无权发布它。我希望你仍然可以帮助我,拜托。
  • 我在 Visual Studio 2017 (C++) 文件中使用他的代码,然后使用 mex mexGetDepth.cpp 来使用该函数。我得到的唯一错误是 glReadPixels 和 glGetIntegerv identifier not found

标签: matlab depth-buffer


【解决方案1】:

似乎最好的方法是通过 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 identifier not found

这很可能是因为在编译期间没有正确链接库。

假设您正在使用这个 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);

我希望这会有所帮助。

【讨论】:

  • 感谢您的回复。我尝试使用编译器方法,您在上面向我展示了。由于未找到 glReadPixels 和 glGetIntegerv 标识符的错误,它似乎仍然无法编译。 “OpenGL32.lib 的路径”是一个通用命令(它是内置在 MATLAB 中还是特定于系统?)因为我尝试使用它但它无法编译代码。感谢您的时间和帮助。
  • 抱歉,如果不清楚:当我写 OpenGL32.lib 的路径时,你的目的是找到你自己系统的 OpenGL32.lib 版本(我发现我的超级快速浏览在 OpenGL32.lib 中输入的开始菜单搜索)。如果找不到,则需要安装 windows SDK 工具。它将类似于 C:\Program Files (x86)\Windows Kits
  • 我查看了 Windows Kits 并找到了 OpenGL32.Lib 文件。我尝试通过键入(mexGetDepth.cpp 是我的文件名)用我的 cpp 代码编译它: mex mexGetDepth.cpp "path to OpenGL32.lib" 但由于某种原因仍然出现相同的错误。我什至通过将 OpenGL32.lib 与我的代码放在同一个文件夹中来尝试它,并以同样的错误告终。我正在使用 MATLAB R2017b,是否有不同的方式来键入该命令?感谢您一直以来的帮助。
  • 如果它在同一个文件夹中,那么命令将是mex mexGetDepth.cpp -lOpenGL32.lib。如果您在编译 MEX 时不确定链接(-l 命令),请关注 this link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
  • 2018-05-27
相关资源
最近更新 更多