我正在从 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/