2013-04-02 17 views
5

W mojej pracy nakładam część przechwyconej klatki na obraz. Otwieram kamerę internetową z openCV, a następnie przekształcam przechwyconą ramkę w teksturę i wyświetlam ją w oknie GLUT. Ponadto, pokrywają część tej tekstury z tego zdjęcia:Wyświetlanie obrazu z OpenGL i antyaliasingiem

enter image description here

zrobić to w czasie rzeczywistym, a wynik jest:

enter image description here

Jak widać, krawędzie wyświetlany obraz jest niedokładny. Myślę, że jest to problem z aliasingiem, ale nie wiem jak zrobić proces antyaliasingu z opengl. Próbowałem szukać w Internecie, ale nie znalazłem dobrego rozwiązania dla mojego problemu.

W mojej funkcji „Oblicz” I przekształcać obraz mata do tekstury usign następujący kod:

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

i pokażę wynik przy użyciu tego kodu:

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

} 

W inicjalizacji funkcyjnej I napisać to:

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

} 

ale to nie działa ...

Pracuję na Win7 x64, z OPenGL 4.0 i Glut 3.7. Moja karta wideo to NVIDIA GeForce gt 630. również włączyłem antyaliasing z panelu sterowania Nvidia, ale nic się nie zmieniło. czy ktoś wie, jak mi pomóc?

+0

Czy możesz wyjaśnić, co masz na myśli przez "krawędzie wyświetlanego obrazu są niedokładne"? Czy problem polega na tym, że są "jaggy"? A może kolorowany prostokąt nie pokrywa całej maty? – bwroga

+0

Są "jaggy". Wyświetlany obraz obejmuje obszar, który wcześniej zdecydowałem, więc zasięg nie jest problemem. Moim problemem jest to, że krawędzie są "jaggy", jak mówisz! – Cristina1986

+0

Czy próbowałeś czegoś, co jest opisane na [tej stronie] (http://bankslab.berkeley.edu/members/chris/AntiAliasing/AntiAliasingInOpenGL.html)? – bwroga

Odpowiedz

2

Najpierw zastanawiam się, dlaczego używasz OpenGL 4.0 do pracy ze stałym (przestarzałym) potokiem ... Ale przejdźmy do problemu. Co jest potrzebne, to MSAA. Nie jestem pewien, włączenie go za pomocą panelu sterowania będzie zawsze zrobić sztuczkę. Zazwyczaj robi się to wewnątrz kodu. Niestety dla ciebie, zdecydowałeś się użyć GLUT, który nie ma opcji ustawienia poziomu MSAA sprzętu. Jeśli chcesz, możesz to zmienić na GLFW. Inna opcja to zrobić ręcznie, ale to oznacza, że ​​używasz niestandardowych FBOs.In takich scenariusz, w którym można utworzyć plik FBO z ustawieniem dla tekstury MSAA, ustawienie poziomu MSAA dla tekstury (można również zastosować niestandardowe algorytmy multisamplingu w module cieniowania fragmentów, jeśli chcesz). Here to wątek na ten temat.

GLFW pozwala na określenie poziomu MSAA podczas instalacji okna. Zobacz powiązany interfejs API.

MSAA obniża wydajność, ale ile zależy od sprzętu i prawdopodobnie sterowników OpenGL.

+0

Dziękuję za odpowiedź! Spróbuję użyć GLFW zamiast GLUT, jeśli to rozwiąże mój problem! Jeśli wiesz, rozwiązuję mój problem, pisząc tylko 'glfwOpenWindowHint (GLFW_FSAA_SAMPLES, wartość int większa niż 0)' ?? Czy muszę napisać inny kod ??? i dlaczego jesteś zaskoczony, że używam opengl 4.0 do wyświetlania obrazu na części przechwyconej ramki? Mam inne pytanie: w jaki sposób MSAA wpływają i obniżają wydajność aplikacji w czasie rzeczywistym? – Cristina1986

+0

Zobacz moją odpowiedź. Do OpenGL 4.0 - jest przeznaczony do użytku z nowoczesnym (programowalnym potokiem). Używasz starej i przestarzałej funkcjonalności, która wciąż działa, ale nie jest już standardem programowania OpenGL. –

3

Rozwiązałem mój problem! Użyłem GLFW zarzuconego GLUT, jak zasugerował mi Michael Michael!

w tym celu antyaliasing z GLFW użyłem tej linii kodu:

glfwOpenWindowHint(GLFW_FSAA_SAMPLES,4);

a wynik jest bardzo dobry, jak widać na poniższym obrazku.

enter image description here

Dzięki za pomoc!

Powiązane problemy