使用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

相關文章
相關標籤/搜索