liweimcc
4/24/2017 - 2:04 PM

gistfile1.txt

// init tex
glGenTextures(1, &m_depthMapTex);
glBindTexture(GL_TEXTURE_2D, m_depthMapTex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, m_width, m_height,
    0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);

// init frame buffer
glGenFramebuffersEXT(1, &m_depthMapFBO);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_depthMapFBO);

glBindTexture(GL_TEXTURE_2D, m_depthMapTex);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_depthMapTex, 0);

// render depth
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDisable(GL_LIGHTING);
glDepthMask(GL_TRUE);
glEnable(GL_DEPTH_TEST);
glViewport(0, 0, m_width, m_height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
Eigen::Matrix4f proj = Eigen::projectFromInstrincs<float>(
    m_raster->shot.m_intrinsics, m_width, m_height, m_zNear, m_zFar);

if (proj.IsRowMajor) {
    proj.transposeInPlace();
}

glMultMatrixf(proj.data());

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
Eigen::Matrix4f modelview = m_modelMat * m_raster->shot.m_extrinsics;

if (modelview.IsRowMajor) {
    modelview.transposeInPlace();
}

glMultMatrixf(modelview.data());

glBegin(GL_TRIANGLES);
glColor3ub(127, 127, 127);
for (int cnt = 0; cnt < m_mesh->m_faces.rows(); cnt++) {
    int idx1 = m_mesh->m_faces(cnt, 0);
    int idx2 = m_mesh->m_faces(cnt, 1);
    int idx3 = m_mesh->m_faces(cnt, 2);

    glVertex3f(m_mesh->m_vertices(idx1, 0),
        m_mesh->m_vertices(idx1, 1), m_mesh->m_vertices(idx1, 2));

    glVertex3f(m_mesh->m_vertices(idx2, 0),
        m_mesh->m_vertices(idx2, 1), m_mesh->m_vertices(idx2, 2));

    glVertex3f(m_mesh->m_vertices(idx3, 0),
        m_mesh->m_vertices(idx3, 1), m_mesh->m_vertices(idx3, 2));
}
glEnd();

// make sure matrix is column major storage, to meet OpenGL requirement
Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor> teximage(m_width, m_height);
glGetTexImage(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, GL_FLOAT, teximage.data());

if (!m_outDepthFile.empty()) {
    cv::Mat outDepthImage(m_height, m_width, CV_32FC1);
    float* pOutDepthImage = (float*)outDepthImage.data;

    float min = teximage.minCoeff();
    float max = teximage.maxCoeff();
    float scale = float(UINT16_MAX - 1) / (max - min);

    std::cout << min << " min - (visibility - depth) - max " << max << std::endl;

    Eigen::Map<Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor>> texOut(pOutDepthImage, m_width, m_height);
    texOut = (teximage.array() - min) * scale;

    cv::Mat out, flipped;
    outDepthImage.convertTo(out, CV_16UC1);
    cv::flip(out, flipped, 0);
    cv::imwrite(m_outDepthFile, flipped);
}