使用 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 的原始图像数据的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL + QT:渲染到纹理并显示回来

OpenGL - QT:鼠标移动事件效果未显示

Qt/OpenGL 小部件中的显示损坏

如何使用 OpenGL 在 Qt 界面上显示 IPLImage 流进行渲染?

Qt 的 OpenGL 故障(而不是 GLUT)

Qt 使用自带的OpenGL模块开发程序