【问题标题】:OpenGL texture doesn't show correctly - strange behaviourOpenGL 纹理无法正确显示 - 奇怪的行为
【发布时间】:2013-02-08 17:26:12
【问题描述】:

我想用 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 窗口上)从网络摄像头捕获的帧,我没有问题。 我还注意到,如果我在角落使用没有数字的相同图像,它可以正常工作(即使它不在标记的相同位置/坐标)。

有人知道吗?

【问题讨论】:

  • 注册非常好,干得好!

标签: c++ opengl opencv texture2d


【解决方案1】:

这是一个填充/对齐问题。

您正在加载的格式对 GL 有不同的填充要求(默认情况下,它希望将像素行填充为 4 个字节的倍数)。

可能的解决方法是:

  • 告诉 GL 你的纹理是如何打包的,使用(例如)glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  • 更改纹理的尺寸,以便填充匹配而不更改任何内容
  • 更改纹理的加载,以使填充与 GL 期望的一致

【讨论】:

  • 太棒了!你是对的!我在生成纹理之前添加了glPixelStorei(GL_UNPACK_ALIGNMENT, 1);,它可以工作:) 非常感谢!现在我必须解决坐标问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多