我正在使用QT创建者,C ++和OpenGL。我想在GUI中显示视频。
因此我正在使用opencvwidget cpp文件。这里的描述
/ ** *使用OpenCV和Windows捕获帧或单个图像的小部件 使用OpenGL显示它们。 * *本课程集成了OpenCV和Qt。 它是一个可以添加到您的GUI的小部件,它可以处理这两个小部件 捕获和显示视频和单个*图像。 * * 班级 使用双缓冲系统实现:一个cv :: Mat拥有最多 *最近捕获的图像(以下称为捕获图像),另一个保存当前正在窗口小部件中显示的图像* (显示图像)。这允许你*执行处理 在显示之前捕获图像,首先调用* getImage(),然后 altring它,最后调用updateDisplay()。如果你只是想* 立即显示,启用自动显示(使用 enableAutoDisplay())。 * /
当我阅读视频时,显示屏出现问题。的确,我的照片像这样扭曲:
如果我使用其他视频,图像是正确的。我尝试了几个小时,以了解为什么显示不正确,我仍然没有找到解决方案。
我认为问题来自于纹理的应用:
void OpenCVWidget::paintGL()
{
if(displayImage.empty()) {
displayImage = Mat::zeros(1, 1, CV_8UC3); // Paint a black background until we have something to show.
}
qglClearColor(Qt::black); // Create a nice, black background for the parts of the widget with no image.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glVertexPointer(2, GL_FLOAT, 0, vertices.constData());
glTexCoordPointer(2, GL_FLOAT, 0, texCoords.constData());
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
// Non-mipmap way of mapping the texture (fast and clean):
glGenTextures(1, &texture); // Allocate a texture name.
glBindTexture(GL_TEXTURE_2D, texture); // Select our current texture.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // When the texture area is larger then the image, upscale using linear interpolation.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // When the texture area is smaller than the image, downsample using linear interpolation.
glTexImage2D(GL_TEXTURE_2D, 0, 3, displayImage.cols, displayImage.rows, 0, GL_BGR, GL_UNSIGNED_BYTE, displayImage.data);
// End of different methods, the last few lines are common for all methods.
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); // Draw it!
glDeleteTextures(1, &texture);
}
我想知道这不是频道或类似的问题,但我不知道。
如果有人已经处理过这类问题,请帮助我。
非常感谢。