c++ - 使用 OpenGL 在 Qt 中显示来自 DirectShow 的原始图像数据

标签 c++ qt opengl

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

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

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

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

最佳答案

要在 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();

关于c++ - 使用 OpenGL 在 Qt 中显示来自 DirectShow 的原始图像数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23653709/

相关文章:

c++ - 为什么 detectMultiScale 不返回面孔?

c++ - 我可以使用在 CUDA 内核中实现纯虚函数的类吗?

qt - QML StackView 自定义过渡

c++ - 如何在Qt中自动增加/减少标签中的文字大小

c++ - 在 centos 7 上从 Qt 5.11.1 编译错误

c++ - 从 Freeglut/Opengl 2.1 项目获取返回值

c++ - 有没有一本使用 C++ 编写控制台/终端应用程序的书?

c++ - 使用预制命名空间 (C++) 的范围

opengl - 在OpenGL中共享顶点位置但不共享法线

c++ - 安装 OpenGL AUX 库