QOpenGLWidget直接加载cv::Mat进行显示,不使用QImage
时间: 2024-01-07 20:02:46 浏览: 156
可以使用QOpenGLWidget直接加载cv::Mat进行显示,不使用QImage,以下是实现步骤:
1. 在Qt项目中添加QtOpenGL库,并在.pro文件中添加相应的链接库。
2. 在Qt界面中添加一个QOpenGLWidget控件,用于显示图像。
3. 在代码中,使用cv::ogl::Texture2D将cv::Mat转换为OpenGL纹理。
4. 在QOpenGLWidget的paintGL()函数中,使用OpenGL将纹理绘制在窗口中。
以下是示例代码:
```c++
#include <opencv2/opencv.hpp>
#include <opencv2/ogl.hpp>
#include <QOpenGLWidget>
#include <QtOpenGL>
cv::Mat image = cv::imread("example.jpg");
// 将cv::Mat转换为OpenGL纹理
cv::ogl::Texture2D texture(image);
class GLWidget : public QOpenGLWidget
{
public:
GLWidget(QWidget *parent = 0) : QOpenGLWidget(parent) {}
protected:
void initializeGL()
{
glClearColor(0, 0, 0, 1);
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
void paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 绑定纹理
texture.bind();
// 绘制纹理
glBegin(GL_QUADS);
glTexCoord2d(0, 0); glVertex3d(-1, -1, 0);
glTexCoord2d(1, 0); glVertex3d(1, -1, 0);
glTexCoord2d(1, 1); glVertex3d(1, 1, 0);
glTexCoord2d(0, 1); glVertex3d(-1, 1, 0);
glEnd();
}
void resizeGL(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1, 1, -1, 1, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
};
GLWidget *glWidget = new GLWidget();
// 将QOpenGLWidget添加到Qt界面中
glWidget->setParent(ui->centralWidget);
glWidget->resize(ui->centralWidget->width(), ui->centralWidget->height());
glWidget->show();
```
以上代码将cv::Mat转换为OpenGL纹理,并在QOpenGLWidget中绘制纹理,实现了直接加载cv::Mat进行显示的功能。
阅读全文