使用OpenGL在Qt中显示DirectShow的原始图像数据

时间:2014-05-14 11:42:14

标签: c++ qt opengl

我正在从DirectShow设备捕获相机帧,并且具有回调函数,该函数在缓冲区内具有原始图像字节并将其交给小部件。

此小部件应该是包含实时图像的QtOpenGL小部件。 (它应该以OpenGL或其他快速方法呈现)

有没有办法用QGLWidget或QSurface等其他类型显示原始图像数据?我发现并尝试使用命令(如glBegin)的所有示例都无法使用,因为我使用带有ANGLE的Qt 5.1版本。

至少我能够在带有QImage的QLabel中显示图像(它是颠倒的,但这只是第一次尝试查看缓冲区和回调函数是否有效)。

1 个答案:

答案 0 :(得分:1)

QLabel 显示图像(不是颠倒):

ui->imageLabel->setPixmap(QPixmap::fromImage(img.mirrored(false, true)));

这里的问题是你正在使用Qt不期望的GL / Windows格式的图像。 Qt期望X11格式是一个180°旋转的GL图像。

但你也可以继续使用QGLWidget绘制正方形并将图像作为纹理映射到它上面。

它如何适用于QGLWidget中的 OpenGL

GLuint texture;
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image_buffer);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glColor3f(1.0, 1.0, 1.0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBegin(GL_TRIANGLE_STRIP);
glTexCoord2f(0, 0);
glVertex2f(-1, -1);
glTexCoord2f(1, 0);
glVertex2f(1, -1);
glTexCoord2f(0, 1);
glVertex2f(-1, 1);
glTexCoord2f(1, 1);
glVertex2f(1, 1);
glEnd();
glPopMatrix();