使用QT5绘制OpenCV3的Mat图像

栏目: 编程工具 · 发布时间: 7年前

内容简介:使用QT5绘制OpenCV3的Mat图像

使用QT5绘制OpenCV3的Mat图像

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

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

一 首先初始化QImage空间

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

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

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

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

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

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

二 复制空间

//首先将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();

更多的资料也可以关注我csdn上的视频课程


以上所述就是小编给大家介绍的《使用QT5绘制OpenCV3的Mat图像》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Algorithms for Image Processing and Computer Vision

Algorithms for Image Processing and Computer Vision

Parker, J. R. / 2010-12 / 687.00元

A cookbook of algorithms for common image processing applications Thanks to advances in computer hardware and software, algorithms have been developed that support sophisticated image processing with......一起来看看 《Algorithms for Image Processing and Computer Vision》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具