使用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上的視訊課程 夏老師課程專欄http://edu.csdn.net/lecturer/961
http://edu.csdn.net/course/detail/4789