使用 OpenGL 在 Qt 中显示来自 DirectShow 的原始图像数据
Posted
技术标签:
【中文标题】使用 OpenGL 在 Qt 中显示来自 DirectShow 的原始图像数据【英文标题】:Displaying raw image data from DirectShow in Qt with OpenGL 【发布时间】:2014-05-14 11:42:14 【问题描述】:我正在从 DirectShow 设备捕获相机帧,并有一个回调函数,该函数将原始图像字节保存在缓冲区中并将其交给小部件。
这个小部件应该是一个包含实时图像的 QtOpenGL 小部件。 (它应该在 OpenGL 或其他快速方法中渲染)
有没有办法使用 QGLWidget 或其他类型(如 QSurface)显示原始图像数据?我发现并尝试使用的所有示例都使用了我无法使用的命令(如 glBegin),因为我使用带 ANGLE 的 Qt 5.1 版本。
至少我能够使用 QImage 在 QLabel 中显示图像(它是颠倒的,但那只是首先尝试查看缓冲区和回调函数是否有效)。
【问题讨论】:
如果是关于 opengl ES 的问题,您应该考虑重新措辞。或者更好:为 OpenGL ES 明确地重新打开一个问题,否则不清楚你想要什么(也删除 c++、qt 和 opengl 标签)。 【参考方案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();
【讨论】:
我如何使用有限的 OpenGL ES 调用来执行纹理映射方法?我是否必须为此创建一个着色器模型并将纹理映射到它上面? @omgodie 我添加了代码来展示它如何与 OpenGL 一起工作......不知道它是否可以在 OpenGL ES 中工作:S以上是关于使用 OpenGL 在 Qt 中显示来自 DirectShow 的原始图像数据的主要内容,如果未能解决你的问题,请参考以下文章