【问题标题】:Texture Binding : OpenGL + OpenCV纹理绑定:OpenGL + OpenCV
【发布时间】:2015-03-26 18:23:55
【问题描述】:

我正在尝试从文件中读取图像并将其映射为 openGL 纹理。 OpenCV 正在正确读取图像并将其显示在从那里创建的窗口中。但纹理映射部分不起作用。找不到原因。我的代码如下:

int InitGL(GLvoid){

    try
    {
        Mat img = imread("aaa.jpg", CV_LOAD_IMAGE_ANYDEPTH);
        if (&img != NULL)
        {
            namedWindow("Show Image", CV_WINDOW_AUTOSIZE);
            imshow("Show Image", img);
        }
        glGenTextures(1, texture);
        glBindTexture(GL_TEXTURE_2D, texture[0]);
        glTexImage2D(GL_TEXTURE_2D, 0, 3, img.cols, img.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, img.data);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        img.release();
    }
    catch (Exception e)
    {
        cout << "My Msg: " +e.msg << endl;
    }

    glEnable(GL_TEXTURE_2D);
    glShadeModel(GL_SMOOTH);               // enabling smooth shader
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);  // black background

    glClearDepth(1.0f);                    // depth buffer setup
    glEnable(GL_DEPTH_TEST);               // enable depth testing
    glDepthFunc(GL_LEQUAL);                // the type of depth test to do

    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);     
    return TRUE;                           // initialization went ok
}

int DrawGLScene(GLvoid){


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);         // Clear The Screen And The Depth Buffer
    glLoadIdentity();
    glTranslatef(0.0f, 0.0f, -6.0f);                   // Move Right 3 Units
    glRotatef(rotationQuad, 1.0f, 0.0f, 0.0f);
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glBegin(GL_QUADS);
        // Front Face
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);  // Bottom Left Of The Texture and Quad
        glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);  // Bottom Right Of The Texture and Quad
        glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f);  // Top Right Of The Texture and Quad
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);  // Top Left Of The Texture and Quad
        // Back Face
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);  // Bottom Right Of The Texture and Quad
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);  // Top Right Of The Texture and Quad
        glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);  // Top Left Of The Texture and Quad
        glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f);  // Bottom Left Of The Texture and Quad
        // Top Face
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);  // Top Left Of The Texture and Quad
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);  // Bottom Left Of The Texture and Quad
        glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f);  // Bottom Right Of The Texture and Quad
        glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);  // Top Right Of The Texture and Quad
        // Bottom Face
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);  // Top Right Of The Texture and Quad
        glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f);  // Top Left Of The Texture and Quad
        glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);  // Bottom Left Of The Texture and Quad
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);  // Bottom Right Of The Texture and Quad
    // Right face
        glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f);  // Bottom Right Of The Texture and Quad
        glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);  // Top Right Of The Texture and Quad
        glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f);  // Top Left Of The Texture and Quad
        glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);  // Bottom Left Of The Texture and Quad
    // Left Face
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);  // Bottom Left Of The Texture and Quad
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);  // Bottom Right Of The Texture and Quad
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);  // Top Right Of The Texture and Quad
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);  // Top Left Of The Texture and Quad
    glEnd();                           // Done Drawing The Quad

    rotationQuad -= 0.15f;
    return TRUE;                                 // Everything Went OK
}

从 OpenCV 创建的窗口正在显示图像。它用于调试和测试图像是否正确读取。立方体被认为是有纹理的。但它没有显示任何纹理。

【问题讨论】:

  • 请使用:if (! img.empty()) 进行检查,Mat 的地址将始终有效。
  • 那部分工作正常。纹理绑定部分不起作用... :( @berak
  • 图片的分辨率是多少?也许它必须是“2 的幂”或一些类似的限制?
  • 尝试在glTexImage2D(...); 之前调用glPixelStorei(GL_UNPACK_ALIGNMENT, 1);。默认情况下,OpenCV 将图像存储在连续的内存段中。
  • OpenCV 也使用 BGR 格式,所以你应该将源格式更改为GL_BGR

标签: c++ opencv opengl textures texture-mapping


【解决方案1】:

使用:
glGenTextures(1, &amp;texture[0]);
而不是:
glGenTexures(1, texture);
解决了。​​

【讨论】:

    猜你喜欢
    • 2013-09-07
    • 2013-08-07
    • 1970-01-01
    • 2011-07-13
    • 2015-02-26
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多