OpenGL纹理显示不正确-奇怪的效果

4
我想使用OpenCV检测标记,然后用OpenGL将其覆盖在图像上。第一部分已经完成(我已经完美地实现了标记检测),但是第二部分有一些问题。
标记如下: enter image description here 图像如下: enter image description here 但结果却是这样的: enter image description here 生成图像纹理的代码如下:
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窗口中)从网络摄像头捕获的帧,没有任何问题。 我也注意到,如果我使用没有角落数字的相同图像,它可以正常工作(即使它不在标记的相同位置/坐标)。 有人有任何想法吗?

这是非常好的注册,干得好! - genpfault
1个回答

6
这是一个关于填充/对齐的问题。
你正在加载一个格式,其填充要求与GL不同(默认情况下,GL希望像素行填充为4字节的倍数)。
可能的解决方法包括:
- 告诉GL如何打包你的纹理,例如使用glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - 改变你的纹理尺寸,使得填充匹配而不改变任何东西 - 改变你的纹理加载方式,使得填充与GL期望的一致

太好了!你是对的!我在生成纹理之前添加了 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);,现在它可以工作了 :)非常感谢!现在我需要解决坐标问题! - Cristina1986

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接