使用opengl和Antialiasing投影图像

时间:2013-04-02 12:41:21

标签: c++ opengl antialiasing

在我的作品中,我将捕获的帧的一部分与图像重叠。我用openCV打开网络摄像头,然后在纹理中转换捕获的帧并在GLUT窗口中显示它。此外,我将此纹理的一部分与此图像重叠:

enter image description here

我是实时做的,结果是:

enter image description here

如您所见,投影图像的边缘不准确。我认为这是一个别名问题,但我不知道如何使用opengl进行抗锯齿处理。我试图在网上寻找,但我找不到解决问题的好方法。

在我的“计算”功能中,我将mat图像转换为纹理,使用以下代码:

GLvoid calculate(){
...
...
cvtColor(image, image, CV_BGR2RGB);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glBindTexture(GL_TEXTURE_2D, textures[1]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    //glTexImage2D(GL_TEXTURE_2D, 0, 4,image.cols, image.rows, 0, GL_RGB,GL_UNSIGNED_BYTE, image.data);
    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image.cols, image.rows, GL_RGB, GL_UNSIGNED_BYTE, image.data);
}

我用这段代码显示结果:

GLvoid Show(void) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);

    // Matrice di proiezione
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, WIDTH, HEIGHT, 0); 

    // Matrice model view
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity(); 
...
...
glBindTexture(GL_TEXTURE_2D, textures[1]);
        glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 0.0f); glVertex2f((GLfloat)((coord[3].x)),(GLfloat)(coord[3].y));
        glTexCoord2f(1.0f, 0.0f); glVertex2f((GLfloat)((coord[0].x)),(GLfloat)(coord[0].y));
        glTexCoord2f(1.0f, 1.0f); glVertex2f((GLfloat)((coord[1].x)),(GLfloat)(coord[1].y));
        glTexCoord2f(0.0f, 1.0f); glVertex2f((GLfloat)((coord[2].x)),(GLfloat)(coord[2].y)); 

        glEnd();    
    }
    glFlush();
    glutSwapBuffers();

}

在初始化函数中我写这个:

GLvoid Init() {  

    glGenTextures(2, textures);
    glClearColor (0.0, 0.0, 0.0, 0.0);

    glEnable (GL_POLYGON_SMOOTH);
    glHint (GL_POLYGON_SMOOTH_HINT, GL_DONT_CARE);
    glDisable(GL_DEPTH_TEST);

}

但它不起作用......

我在Win7 x64上工作,使用OPenGL 4.0和Glut 3.7。我的视频卡是NVidia GeForce gt 630.我也从Nvidia控制面板启用了抗锯齿功能,但没有任何改变。 有谁知道如何帮助我?

2 个答案:

答案 0 :(得分:3)

我解决了我的问题!正如@Michael IV建议的那样,我使用了GLFW GLUT,但

为了使用GLFW进行抗锯齿,我使用了这行代码:

glfwOpenWindowHint(GLFW_FSAA_SAMPLES,4);

现在结果非常好,如下图所示。

enter image description here

感谢您的帮助!

答案 1 :(得分:2)

首先我想知道你为什么使用OpenGL 4.0来处理固定(已弃用)的管道...... 但是让我们来解决问题。你需要的是MSAA。我不确定,通过控制面板启用它总是可以解决问题。通常它是在代码内部完成的。 不幸的是,您选择使用GLUT,它没有选项来设置硬件MSAA级别。如果您希望能够这样做,请切换到GLFW。另一种选择是手动执行,但这意味着您使用自定义FBO在这种情况下,您可以创建具有纹理的MSAA纹理附件设置MSAA级别的FBO(如果您愿意,也可以在片段着色器中应用自定义多重采样算法)。 Here是关于此主题的主题。

GLFW允许您在窗口设置上指定MSAA级别。请参阅相关的API。

MSAA会降低性能,但多少取决于您的硬件和可能的OpenGL驱动程序。