使用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();

跟多内容也可以观看我51cto学院的课程

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

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

时间: 2024-10-09 05:12:10

使用QT5绘制OpenCV3的Mat图像的相关文章

OpenCV中Mat,图像二维指针和CxImage类的转换

在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转换和相应的对应关系. 一.OpenCV的Mat类到图像二值指针的转换 以下为函数代码: unsigned char** MatTopImgData(Mat img) { //获取图像参数 int row = img.rows; int col = img.cols; int band = img.c

绘制Mat图像

GDI void drawResult (cv::Mat outTrace, unsigned int id){ BYTE *g_pBits; HDC g_hMemDC; HBITMAP g_hBmp, g_hOldBmp; CDC *pDC; CStatic *pic; int width, height; CRect rect; /******************初始化将Mat转为Iplimage************************************/ IplImage

[转]opencv3 图像处理 之 图像缩放( python与c++实现 )

转自:https://www.cnblogs.com/dyufei/p/8205121.html 一. 主要函数介绍 1) 图像大小变换 cvResize () 原型: voidcvResize(const CvArr* src,CvArr* dst,intinterpolation=CV_INTER_LINEAR ); 说明: src 表示输入图像.dst表示输出图像.intinterpolation插值方法,有以下四种: CV_INTER_NN - 最近邻插值,CV_INTER_LINEAR

《OpenCV:访问Mat图像中每个像素值》

图像容器Mat 还是先看Mat的存储形式.Mat和Matlab里的数组格式有点像,但一般是二维向量,如果是灰度图,一般存放<uchar>类型:如果是RGB彩色图,存放<Vec3b>类型. 单通道灰度图数据存放格式: 多通道的图像中,每列并列存放通道数量的子列,如RGB三通道彩色图: 注意通道的顺序反转了:BGR.通常情况内存足够大的话图像的每一行是连续存放的,也就是在内存上图像的所有数据存放成一行,这中情况在访问时可以提供很大方便.可以用 isContinuous()函数来判断图像

Mat 图像和 BMP格式图像的相互转换

目录 一.前言 二.Mat 和 BMP 数据结构 三.转换实现思路 四.Mat 转 BMP 五.BMP转Mat 六.一点体会 一.前言 ? 格式转换很常见,其实在我实现了 Mat 转 BMP 之后才发现原来 imwrite 接口可以直接将 Mat 数据保存为 .bmp图像,不过下文所谈及的转换是在内存中的转换,因为将图像发送给识别服务器时显然不能先将 Mat 保存为 .bmp 文件,然后再读该文件以二进制形式发送给识别服务,而是应该直接在内存中完成其转换. 二.Mat 和 BMP 数据结构 Ma

[Qt5] Develop openCV3 by QML on Qt-creator

QML的酷炫控件,适合移动设备开发. qt-creator的跨平台是QML与opencv的粘合剂. 关键: QImage有若干种格式,转化为相应的Mat. Mat处理完后,还要正确得还原为原来格式的QImage. 关键在于:QImage2cvMat(image);cvmat2qimage(mat);的定义. 图像格式的转化: static void _gray(QString sourceFile, QString destFile){ QImage image(sourceFile); if(

Matlab技巧1:在同一坐标系上绘制两个函数图像

x=-2:0.01:2; y1=sqrt(2*abs(x)-x.^2); y2=asin(abs(x)-1)-pi/2; plot(x,y1,'r',x,y2,'b') grid 程序结果:

python matplotlib 绘制三次函数图像

安装的是anaconda, 其中包含了numpy, scipy, matplotlib 等科学计算包 https://www.continuum.io/downloads 在终端打开anaconda中的python /home/qi/anaconda/bin/python >>> from matplotlib import pyplot as pl >>> import numpy as np >>> from scipy import interp

图像绘制

方法 描述drawImage() 向画布上绘制图像.画布或视频像素操作 属性 描述width 返回 ImageData 对象的宽度height 返回 ImageData 对象的高度data 返回一个对象,其包含指定的 ImageData 对象的图像数据方法 描述createImageData() 创建新的.空白的 ImageData 对象getImageData() 返回 ImageData 对象,该对象为画布上指定的矩形复制像素数据putImageData() 把图像数据(从指定的 Image