使用OpenGL简单绘制Opencv图像,以及遇到的问题

使用OpenGL简单绘制Opencv图像,以及遇到的问题

1.环境
  • Visual Studio 2022+QT
  • OpenCV4.7.0
2.实现步骤
  • 在VS中:项目>项目属性>Qt Project Settings>Qt Modules>Select Modules>勾选OPenGL模块。

在这里插入图片描述

  • 创建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格式的图片。

  • 在ui文件中添加OpenGL Widget控件

在这里插入图片描述

  • 并把控件的类提升为刚刚创建继承于QOpenGLWidget的MatView类

在这里插入图片描述

  • 运行结果

在这里插入图片描述

3.遇到的问题
  • Release模式显示黑白扭曲图片

在这里插入图片描述

原因:OpenGL要求所有的纹理都是4字节对齐的,即纹理的大小永远是4字节的倍数。
解决办法:把图片裁剪为4字节倍数大小,如512*512; 或者使用接口glPixelStorei(GL_UNPACK_ALIGNMENT, 1)。

  • Debug模式不显示图片,调试发现src = cv::imread()没有读取到图片。

在这里插入图片描述

原因:我开始使用的是直接使用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最好不要放一起,否则有可能会导致其中一个模式出问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值