2013-04-02 61 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

感謝您的幫助!