使用QT5绘制OpenCV3的Mat图像

  QT在跨平台编程中应用愈来愈普遍,C++中用跨平台开发界面(包括嵌入式设备),QT基本成为第一选择,OpenCV从3.0开始已经慢慢抛弃了过去的C接口,统一改成C++接口,存储图像的IplImage也在被Mat替代,本文主要讲如何使用QT绘制Mat。html

    在QT中用QImage存放图像,QImage有多种使用方法,本文讲解QImage的内存分配和将Mat高效复制到QImage中。编程

一 首先初始化QImage空间编辑器

int pixSize = 3; //像素大小 RGB888就是三个字节ide

uchar *buf = new uchar[width()*height() * pixSize ];函数

img = QImage(buf, width(), height(), QImage::Format_RGB888);学习

pixSize 表示像素大小 像素大小 RGB888就是三个字节this

其中width()和height()对应的是QWidge控件的宽和高,这里要注意的一点是QWidge的宽度最好是4的倍数,QImage存储的每行空间是按4对齐,若是不是4的倍数,他会补空的,这样会形成图像空间不连续,预分配的空间就不对了。后面的复制策略也要变化,效率也会降低一些,须要一行一行复制。spa

Format_RGB888是QImage支持的像素格式,5.8版本开始支持灰度图了,Format_RGB888表示RGB分别用8位存储也就是3个字节;orm

二 复制空间视频

//首先将Mat图像的大小变为和QImage一致,这里就是肯定显示策略,直接大小一致,表示图像拉升到和QWidge一致。

Mat des;

cv::resize(mat, des, Size(img.size().width(), img.size().height()));

//颜色转换,QImage目前不支持 BGR888,因此须要转换,否则颜色次序不对

cv::cvtColor(des, des, COLOR_BGR2RGB);

//最后复制空间,这里要注意的是要保证Mat是连续空间(打开图像和视频默认都是连续空间),QImage也是连续空间(4的倍数)。

memcpy(img.bits(), des.data, des.cols*des.rows*des.elemSize());

三 绘制图像

最后重载 paintEvent函数对QImage进行绘制

QPainter p;

p.begin(this);

p.drawImage(QPoint(0, 0), img);

p.end();


跟多内容也能够观看我51cto学院的课程

夏老师的课堂 http://edu.51cto.com/lecturer/12016059.html


学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程


365d96021924bdc5a46686c653cff0df299a1c_m

http://edu.51cto.com/course/course_id-8934.html

相关文章
相关标签/搜索