Текстура OpenGL отображается неправильно - странное поведение

Я хочу обнаружить маркер с помощью OpenCV, а затем я хочу наложить его на изображение с помощью OpenGL. Первая часть в порядке (у меня отлично получается маркер обнаружения), но у меня есть некоторые проблемы со второй.

маркер это:

введите здесь описание изображения

и изображение:

введите здесь описание изображения

но результат такой:

введите здесь описание изображения

код для генерации текстуры изображения:

GLuint *textures = new GLuint[2];
glGenTextures(2, textures);
Mat image = imread("Immagine.png");
glBindTexture(GL_TEXTURE_2D, textures[1]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, 4,image.cols, image.rows, 0, GL_RGB,GL_UNSIGNED_BYTE, image.data);

и чтобы показать текстуру, которую я использую:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, WIDTH, HEIGHT, 0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glBindTexture(GL_TEXTURE_2D, textures[1]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f((GLfloat)(coord[1].x),(GLfloat)(coord[1].y));
glTexCoord2f(1.0f, 0.0f); glVertex2f((GLfloat)(coord[2].x),(GLfloat)(coord[2].y));
glTexCoord2f(1.0f, 1.0f); glVertex2f((GLfloat)(coord[3].x),(GLfloat)(coord[3].y));
glTexCoord2f(0.0f, 1.0f); glVertex2f((GLfloat)(coord[0].x),(GLfloat)(coord[0].y)); 
glEnd();

Я не знаю, почему текстурированное изображение такое странное. Кроме того, я использую тот же код для отображения (в окне opengl) захваченных кадров с веб-камеры, и у меня нет проблем. Я также заметил, что если я использую одно и то же изображение без номеров по углам, оно работает правильно (даже если оно не находится в том же месте/координатах маркера).

У кого-нибудь есть идеи?


person Cristina1986    schedule 08.02.2013    source источник
comment
Хорошая регистрация, молодец!   -  person genpfault    schedule 08.02.2013


Ответы (1)


Это проблема заполнения/выравнивания.

Вы загружаете формат, который имеет другие требования к заполнению по сравнению с GL (который по умолчанию ожидает, что строки пикселей будут дополнены до кратного 4 байтам).

Возможные исправления для этого:

  • Сообщите GL, как упакована ваша текстура, используя (например) glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  • Измените размеры вашей текстуры так, чтобы отступы совпадали, ничего не меняя.
  • Измените загрузку вашей текстуры, чтобы отступы соответствовали ожиданиям GL.
person JasonD    schedule 08.02.2013
comment
Здорово! Ты прав! Я добавил glPixelStorei(GL_UNPACK_ALIGNMENT, 1); перед созданием моей текстуры, и это работает :) большое спасибо! Теперь мне нужно решить проблему с координатами! - person Cristina1986; 08.02.2013