使用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图像》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

启示录

启示录

[美] Marty Cagan / 七印部落 / 华中科技大学出版社 / 2011-5 / 36.00元

为什么市场上那么多软件产品无人问津,成功的产品凤毛麟角?怎样发掘有价值的产品?拿什么说服开发团队接受你的产品设计?如何将敏捷方法融入产品开发?过去二十多年,Marty Cagan作为高级产品经理人为多家一流企业工作过,包括惠普、网景、美国在线、eBay。他亲历了个人电脑 、互联网、 电子商务的起落沉浮。《启示录:打造用户喜爱的产品》从人员、流程、产品三个角度介绍了现代软件(互联网)产品管理的实践经......一起来看看 《启示录》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具