web-dev-qa-db-fra.com

Convertir Python Image Opencv (tableau numpy) en image PyQt QPixmap

J'essaie de convertir python image opencv en QPixmap.

Je suis l'instruction montre Lien de page et mon code est joint ci-dessous

img = cv2.imread('test.png')[:,:,::1]/255. 
imgDown = cv2.pyrDown(img)
imgDown = np.float32(imgDown)        
cvRGBImg = cv2.cvtColor(imgDown, cv2.cv.CV_BGR2RGB)
qimg = QtGui.QImage(cvRGBImg.data,cvRGBImg.shape[1], cvRGBImg.shape[0], QtGui.QImage.Format_RGB888)
pixmap01 = QtGui.QPixmap.fromImage(qimg)
self.image01TopTxt = QtGui.QLabel('window',self)
self.imageLable01 = QtGui.QLabel(self)
self.imageLable01.setPixmap(pixmap01)

Le code n'a pas d'erreur de compilation et d'exécution, mais la conversion est incorrecte et j'obtiens juste une image de bruit. Je ne sais pas quel est le problème. Quelqu'un pourrait-il aider?

14
SimaGuanxing

Utilisez ceci pour convertir cvImage en Qimage, ici cvImage est l'image originale

height, width, channel = cvImg.shape
bytesPerLine = 3 * width
qImg = QImage(cvImg.data, width, height, bytesPerLine, QImage.Format_RGB888)

et définissez ce Qimage sur le paramètre Lable.setPixmap de Qimage. Ça marche!!!

24
AdityaIntwala

Complétant simplement la réponse d'AdityaIntwala, si l'image semble être rouge ou bleue, c'est parce que le format n'est pas RVB, mais BGR (l'inverse). Dans ce cas, utilisez la méthode QImage.rgbSwapped pour corriger:

height, width, channel = cvImg.shape
bytesPerLine = 3 * width
qImg = QImage(cvImg.data, width, height, bytesPerLine, QImage.Format_RGB888).rgbSwapped()
4
Sergio Montazzolli
#image is the numpy array that you got from cv2.imread(example_image.jpg)

image = QtGui.QImage(image, image.shape[1],\
                            image.shape[0], image.shape[1] * 3,QtGui.QImage.Format_RGB888)
pix = QtGui.QPixmap(image)

self.scene.addPixmap(pix)
2
SkyCityRuler

Je recommande le package qimage2ndarray qui convertit les tableaux numpy vers/depuis Qimages.

0
am70

Je déteste ajouter au grand nombre de réponses, mais comme c'était la seule chose qui a fonctionné pour moi, je le ferai, au cas où d'autres rencontreraient le même problème.

Comme mentionné ici sur GitHub

Enveloppez d'abord le tableau numpy/ndarry dans un appel à np.require(array, np.uint8, 'C'), tel que:

arr2 = np.require(arr, np.uint8, 'C')
qImg = QtGui.QImage(arr2, width, height, QtGui.QImage.Format_RGB888)
0
so860