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
zrobić to w czasie rzeczywistym, a wynik jest:
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?
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
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
Czy próbowałeś czegoś, co jest opisane na [tej stronie] (http://bankslab.berkeley.edu/members/chris/AntiAliasing/AntiAliasingInOpenGL.html)? – bwroga