2013-04-02 57 views
5

在我的工作中,我将一部分捕获帧与图像重叠。我用openCV打开摄像头,然后将捕获的帧转换为纹理,并将其显示在GLUT窗口中。另外,我重复这个质地的一部分与此图像:用opengl和Antialiasing投影图像

enter image description here

我在实时做到这一点,其结果是:

enter image description here

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

在我的“计算”功能,我变换垫子图像到纹理usign下面的代码:

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控制面板的抗锯齿功能,但没有任何变化。 没有人知道如何帮助我吗?

+0

你能否解释一下“投影图像边缘不准确”的含义?他们是否“棘手”?或者是彩色矩形不能覆盖整个垫子? – bwroga

+0

他们是“jaggy”。投影图像覆盖了我提前决定的区域,因此覆盖率不是问题。我的问题是,如你所说,边缘“锯齿”! – Cristina1986

+0

您是否尝试过[本页](http://bankslab.berkeley.edu/members/chris/AntiAliasing/AntiAliasingInOpenGL.html)中描述的内容? – bwroga

回答

2

首先,我不知道为什么你使用OpenGL 4.0与固定(不建议使用),管道工作... 但是,让我们给你需要的problem.What是MSAA。我不是很确定,通过控制面板启用它总会做窍门。通常它是在代码中完成的。 不幸的是,你选择使用GLUT,它没有选项来设置硬件MSAA级别。如果你想能够这样做切换到GLFW。另一种选择是做手动,但这意味着你使用自定义的FBO。在这样的您可以创建带有MSAA纹理附件的FBO的场景,为纹理设置MSAA级别(如果需要,也可以在片段着色器中应用自定义多重采样算法)。 Here是关于此主题的主题。

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

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

+0

谢谢你的回答!我会尝试使用GLFW代替GLUT,如果这能解决我的问题!如果你知道,我解决我的问题,只写'glfwOpenWindowHint(GLFW_FSAA_SAMPLES,int值大于0)'?或者我必须写其他代码? 为什么你会惊讶于我使用opengl 4.0为了在捕获帧的一部分上投影图像? 我还有一个问题:MSAA如何影响和降低实时应用程序的性能? – Cristina1986

+0

查看我的答案。对于OpenGL 4.0 - 它意味着与现代(可编程管线)一起使用您正在使用旧的和不推荐使用的功能,它仍然可以工作,但不再是OpenGL编程标准。 –

3

我解决了我的问题!我使用GLUT的GLUT,因为@Michael IV建议我!

,为了做到与抗锯齿我GLFW使用下面这行代码:

glfwOpenWindowHint(GLFW_FSAA_SAMPLES,4);

,结果现在是非常好的,因为你可以在下面的图片中看到。

enter image description here

感谢您的帮助!