【问题标题】:projecting image with opengl and Antialiasing使用 opengl 和 Antialiasing 投影图像
【发布时间】:2013-04-02 12:41:20
【问题描述】:

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

我是实时做的,结果是:

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

在我的“计算”函数中,我使用以下代码将垫子图像转换为纹理:

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);

}

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

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

【问题讨论】:

  • 您能解释一下“投影图像的边缘不准确”是什么意思吗?他们是“锯齿状”的问题吗?还是彩色矩形没有覆盖整个垫子?
  • 它们是“锯齿状的”。投影图像覆盖了我事先决定的区域,因此覆盖范围不是问题。我的问题是,正如你所说,边缘是“锯齿状的”!
  • 您是否尝试过类似this page 中描述的方法?
  • 作为旁注,您的相机会根据与实际物体的距离产生一定的“凸起”。由于透视投影的特殊性,投影的正方形不会有那么大的凸起。如果您将正方形镶嵌成更小的正方形,则可以修复它。可能不相关,但可能是。

标签: c++ opengl antialiasing


【解决方案1】:

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

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

glfwOpenWindowHint(GLFW_FSAA_SAMPLES,4);

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

感谢您的帮助!

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回答!如果这能解决我的问题,我会尝试使用 GLFW 而不是 GLUT!如果你知道,我解决我的问题只写glfwOpenWindowHint(GLFW_FSAA_SAMPLES, int value grater than 0 )??或者我必须写其他代码???为什么您对我使用 opengl 4.0 将图像投影到捕获帧的一部分感到惊讶?我还有一个问题:MSAA 如何影响和降低实时应用程序的性能??
    • 查看我的回答。对于 OpenGL 4.0 - 它旨在与现代(可编程管道)一起使用您正在使用旧的和已弃用的功能,这些功能仍然有效,但不再是 OpenGL 编程标准。
    猜你喜欢
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    相关资源
    最近更新 更多