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