【问题标题】:Adding live webcam texture to OpenGL将实时网络摄像头纹理添加到 OpenGL
【发布时间】:2013-01-29 15:39:42
【问题描述】:

我遵循the OpenGL Book 的示例并将其扩展为显示 .3ds 文件。我还设法使用 OpenCV 从我的网络摄像头中获取图像,将 surf 运算符应用于它并找到给定标记的单应性。然后将找到的变换应用于 3D 模型。但是,我无法在我的程序中使用网络摄像头图片作为纹理背景。遵循一些创建纹理的示例似乎有效,但我无法显示它,因为它似乎破坏了 OpenGL 书籍章节中定义的着色器。当我尝试使用预定义的着色器程序时,glUseProgram 返回错误 1282。

可以在给定的 OpenGL 书籍链接中找到着色器代码。我创建纹理的代码如下:

void setze_hintergrund()
{
    if(gp_DataArray->zugriff_bild == false){
/*gp_DataArray is provided to both threads (opencv & opengl) to exchange data like the webcam picture*/

        return;
    } else {

        // alte Textur löschen
        glDeleteTextures(1, &backgroundid);

        // lade das Bild als Textur
        glGenTextures(1, &backgroundid);
        glBindTexture(GL_TEXTURE_2D, backgroundid);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);


        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
            gp_DataArray->kamerabild->width, gp_DataArray->kamerabild->height,
            0, GL_BGR, GL_UNSIGNED_BYTE, gp_DataArray->kamerabild->imageData);
    }

    return;
}

void zeichne_hintergrund()
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glDisable(GL_DEPTH_TEST);
    glDepthMask(GL_FALSE);

    glOrtho(-1, 1, -1, 1, -1, 1);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();   

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, backgroundid);

    glBegin (GL_QUADS);
        glNormal3f(0,0,1);
        glTexCoord2f(1.0, 1.0); glVertex3f(1, -1, -1); // Texturkoordinate rechts oben, Punkt rechts oben hinten setzen
        glTexCoord2f(0.0, 1.0); glVertex3f(-1, -1, -1); // Texturkoordinate links oben, Punkt links oben hinten setzen
        glTexCoord2f(0.0, 0.0); glVertex3f(-1, 1, -1); // Texturkoordinate links unten, Punkt links unten hinten setzen
        glTexCoord2f(1.0, 0.0); glVertex3f(1, 1, -1); // Texturkoordinate rechts unten, Punkt rechts unten hinten setzen
    glEnd ();

    glDisable(GL_TEXTURE_2D);

    glMatrixMode(GL_PROJECTION);
    //glLoadMatrixf(ProjectionMatrix);
    //ProjectionMatrixUniformLocation = glGetUniformLocation(ShaderIds[0], "ProjectionMatrix");
    glUniformMatrix4fv(ProjectionMatrixUniformLocation, 1, GL_FALSE, ProjectionMatrix.m);
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);

    return;
}

【问题讨论】:

  • 您使用的代码已弃用。请看this decent, up-to-date tutorial
  • 永远不要使用固定功能管道。
  • @Bartek:奇怪的是,他正在使用最新的教程。该教程不包括任何已删除的功能。所以他一定是抄袭了其他教程中的代码。

标签: opengl opencv textures shader augmented-reality


【解决方案1】:

如前所述,您不应使用已弃用的函数。大多数不推荐使用的代码都可以在 zeichne_hintergrund() 中看到。 当您想将网络摄像头图像用作进一步渲染的背景时,您应该使用 FBO(帧缓冲区对象)。在 FBO 的帮助下,您可以将网络摄像头图像加载到缓冲区,然后使用相同的缓冲区进行渲染。然后,您可以将此缓冲区加载到纹理并在屏幕上显示,就像您在 zeichne_hintergrund() 函数中尝试的那样。

我曾经使用过的用于渲染纹理的顶点和片段着色器如下所示:

顶点着色器:

#version 430

layout(location=0) in vec4 currentPos;
layout(location=1) in vec2 texPos;
out vec2 ex_TexCoor;

void main(void)
{
    gl_Position = currentPos;
    ex_TexCoor = texPos;
}

currentPos 是顶点的位置,texPos 是关联的 uv 坐标。

片段着色器:

#version 430

in vec2 ex_TexCoor;
out vec4 color;

uniform sampler2D texture;

void main(void){
    color = texture2D(texture, ex_TexCoor);
}

ex_TexCoor 是来自顶点着色器的 uv 坐标,纹理是在这种特殊情况下带有渲染场景的网络摄像头图像。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2019-10-31
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多