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