在上一篇中,明明就可以使用OpenCV的 cv2.imshow()顯示圖片, 那為何還要硬生生的使用matplotlib來顯示圖片呢? 其原因很簡單,就是為了說明BGR及RGB的不同。網路上的大部份文章都是這麼教的。但本站以PyQt為主,所以當然要詳述PyQt與OpenCV的關連
PyQt其實也有自已的一套圖形處理模式,所以應該就不需依賴OpenCV了?? 其實不然,因為OpenCV有很多實用的演算功能是PyQt5所沒有的。所以必需將OpenCV運算後的結果顯示在PyQt上。因此必需了解OpenCV與PyQt5之間的轉換
OpenCV to QPixmap
OpenCV讀入的圖檔為 numpy的陣列格式。若要轉成QPixmap,需將陣列先轉成RGB格式,再用QImage()將陣列轉成QImage格式.
有一點必需注意,img=img[:,:,::-1]是屬於淺度複製,OpenCV可以直接使用。
而img=img[:,:,::-1].copy()是屬於深度複製,QImage只能使用深度複製的numpy 陣列.
def cv_imread(self, filePath):
img = cv2.imdecode(np.fromfile(filePath, dtype=np.uint8), cv2.IMREAD_UNCHANGED)
return img
if __name__=='__main__':
img = self.cv_imread(file)
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img = QImage(img, img.shape[1], img.shape[0], img.shape[1] * 3, QImage.Format_RGB888)
# Label只接收QPixmap格式,可用如下轉換
pix = QPixmap(img)
# 也可以使用fromImage()轉換
# pix=QPixmap.fromImage(img)
# self.lblPicture.setPixmap(pix)
# pix.load(file)
pix = pix.scaled(400, 300)
self.label.setPixmap(pix)