赞
踩
创建MatView类(继承于QOpenGLWidget)
重载paintEvent(QPaintEvent* event)事件
#include "MatView.h" #include <opencv2/opencv.hpp> #include <QPainter> #include <QImage> using namespace cv; MatView::MatView(QWidget* p):QOpenGLWidget(p) { } MatView::~MatView() { } void MatView::paintEvent(QPaintEvent* event) { Mat src = imread("D:/Users/19765/Pictures/123.jpg"); //加载图片 //cvtColor(src, src, COLOR_BGR2RGB); //转换格式 QImage img((const unsigned char*)(src.data), src.cols, src.rows, QImage::Format_BGR888); //转换成QImage QPainter painter; painter.begin(this); painter.drawImage(QPoint(0, 0), img); //绘制QImage图片 }
注意:Opencv存储的图片是BGR格式,而OpenGL是RGB格式,需要进行转换。 可以使用 cvtColor(src, src,COLOR_BGR2RGB)转换格式; 也可以在QImage使用参数:QImage::Format_BGR888 加载BGR格式的图片。
原因:OpenGL要求所有的纹理都是4字节对齐的,即纹理的大小永远是4字节的倍数。
解决办法:把图片裁剪为4字节倍数大小,如512*512; 或者使用接口glPixelStorei(GL_UNPACK_ALIGNMENT, 1)。
原因:我开始使用的是直接使用vcpkg安装的opencv,但是不在QT中使用opencv,在普通的cpp文件Debug和Release模式显示图片都是是没有问题的,这个问题具体原因还没有发现。
解决办法:手动配置opencv,步骤如下:
(1)添加环境变量:D:\OpenCV4.7.0\opencv\build\x64\vc16\bin
(2)在项目>项目属性>VC++目录>包含目录中添加Opencv目录路径:
(3)在项目>项目属性>VC++目录>库目录中添加Opencv库目录路径:
(4)在项目>项目属性>链接器>输入>附加依赖项添加依赖项:
注意有两种lib文件,一种带d的是Debug模式,不带d的是Release模式,根据需要添加一个即可;OpenCV版本不同,前面的序号也不同,需要做相应的修改,两种模式的lib最好不要放一起,否则有可能会导致其中一个模式出问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。