使用OpenCV的UV映射OpenGL

时间:2019-04-22 14:44:41

标签: c++ opencv opengl glut opengl-3

我无法从OpenCV图像中获取图像以映射到OpenGL中的2D平面上。每当我尝试使用下面的代码将图像渲染到平面上时,都会得到黄色的平面,而不是其上的实际图像。

// My Init code
cv::Mat mat(640, 480, CV_8UC3, cv::Scalar(255, 0, 0));

GLuint tid = 0;
if (tid != 0)
{
    glDeleteTextures(1, &tid);
}

glGenTextures(1, &tid);
glBindTexture(GL_TEXTURE_2D, tid);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, mat.cols, mat.rows, 0, GL_BGR, GL_UNSIGNED_BYTE, (void*)mat.data);
glGenerateMipmap(GL_TEXTURE_2D);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_2D, 0);

// My Render Code
{
    glPushMatrix();
    glMatrixMode(GL_MODELVIEW);
    glTranslatef(0, 0, 0);

    glBindTexture(GL_TEXTURE_2D, tid);

    GLfloat sq_vert[] = {-1, -1, 1, -1, 1, 1, -1, 1};
    glVertexPointer(2, GL_FLOAT, 0, sq_vert);
    glEnableClientState(GL_VERTEX_ARRAY);

    GLfloat sq_tex[] = {0, 0, 1, 0, 1, 1, 0, 1};
    glTexCoordPointer(2, GL_FLOAT, 0, sq_tex);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    glActiveTexture(GL_TEXTURE0);
    glEnable(GL_TEXTURE_2D);

    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);

    glBindTexture(GL_TEXTURE_2D, 0);

    glDisable(GL_TEXTURE_2D);
    glPopMatrix();
}

Image

2 个答案:

答案 0 :(得分:1)

我解决了我的问题。.我需要在初始化OpenGL上下文的同一线程中运行上面的initialize()代码。

答案 1 :(得分:0)

在绘制纹理之前,请确保通过glColor()调用将当前颜色状态重置为RGB(1.0、1.0、1.0),否则默认的GL_MODULATE texture environment将乘以所有具有当前颜色状态的纹理像素颜色,最有可能是调试文本中的黄色。

或切换到GL_DECAL,它会完全忽略当前的颜色状态。