В своей работе я перекрываю часть захваченного кадра с изображением. Я открываю свою веб-камеру с помощью openCV, а затем преобразую захваченный кадр в текстуру и отображаю его в окне GLUT. Кроме того, я перекрываю часть этой текстуры с этим изображением:
Я делаю это в режиме реального времени, и результат:
Как видите, края проецируемого изображения неточные. Я думаю, что это проблема сглаживания, но я не знаю, как выполнить процесс сглаживания с помощью opengl. Я пытался найти в Интернете, но я не нашел хорошего решения для моей проблемы.
В моей функции «вычисления» я преобразую изображение мата в текстуру, используя следующий код:
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 для работы с фиксированным (устаревшим) конвейером …
Но давайте перейдем к проблеме. Что вам нужно, так это MSAA .Я не уверен, что включение его через панель управления всегда поможет. Обычно это делается внутри кода.
К сожалению для вас, вы решили использовать GLUT, у которого нет возможности установить аппаратный уровень MSAA. Если вы хотите это сделать, переключитесь на GLFW.Другой вариант — сделать это вручную, но это подразумевает, что вы используете пользовательские FBO. В таком сценарии вы можете создать FBO с приложением текстуры MSAA, устанавливая уровень текстуры MSAA для текстуры (также вы можете применять собственные алгоритмы мультисэмплинга в фрагментном шейдере, если хотите).
Вот есть тема на эту тему.
GLFW позволяет указать уровень MSAA при настройке окна. См. Соответствующий API.
MSAA действительно снижает производительность, но насколько это зависит от вашего оборудования и, возможно, драйверов OpenGL.
Я решил свою проблему! Я использовал GLFW вместо GLUT, как подсказал мне @Michael IV!
для того, чтобы сделать сглаживание с GLFW, я использовал эту строку кода:
glfwOpenWindowHint(GLFW_FSAA_SAMPLES,4);
и результат сейчас очень хороший, как вы можете видеть на следующем рисунке.
Спасибо за вашу помощь!