C++ 用opengl和抗锯齿技术投影图像

C++ 用opengl和抗锯齿技术投影图像,c++,opengl,antialiasing,C++,Opengl,Antialiasing,在我的作品中,我将拍摄的画面的一部分与图像重叠。我用openCV打开我的网络摄像头,然后用纹理变换捕捉到的帧并在GLUT窗口中显示。此外,我将此纹理的一部分与此图像重叠: 我实时进行此操作,结果是: 如您所见,投影图像的边缘不准确。我认为这是一个别名问题,但我不知道如何使用opengl进行抗锯齿处理。我试着在网上寻找答案,但没有找到解决问题的好办法 在“计算”函数中,我使用以下代码将mat图像转换为纹理: GLvoid calculate(){ ... ... cvtColor(image,

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

我实时进行此操作,结果是:

如您所见,投影图像的边缘不准确。我认为这是一个别名问题,但我不知道如何使用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控制面板启用了抗锯齿功能,但没有任何更改。
有人知道如何帮助我吗?

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

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


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

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

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

glfwOpenWindowHint(GLFW_FSAA_示例,4);

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


谢谢您的帮助!

您能解释一下“投影图像的边缘不准确”是什么意思吗?问题是它们“锯齿状”还是彩色矩形没有覆盖整个垫子?它们“锯齿状”.投影的图像覆盖了我预先确定的区域,因此覆盖范围不是问题。我的问题是,正如你所说,边缘是“锯齿状的”!你有没有尝试过中所述的方法?作为旁注,你的相机会有一定的“凸起”取决于与实际对象的距离。由于透视投影的特殊性,投影的正方形不会出现凸出。如果将正方形细分为更小的正方形,则会修复它。可能不相关,但可能相关。谢谢您的回答!如果这能解决我的问题,我将尝试使用GLFW而不是GLUT!如果您知道,我只通过编写
glfwOpenWindowHint(GLFW_FSAA_示例,int值大于0)来解决问题
???或者我必须编写其他代码???为什么我使用opengl 4.0将图像投影到捕获帧的一部分会让您感到惊讶?我还有一个问题:MSAA如何影响和降低实时应用程序的性能??请参阅我的答案。对于opengl 4.0,它是用于现代(可编程管道)的您正在使用旧的和不推荐使用的功能,这些功能仍然有效,但不再是OpenGL编程标准。