El constructor `QImage` tiene una palabra clave desconocida` data`

Supongamos que estoy tomando una imagen de la cámara web usando opencv.

_, img = self.cap.read() # numpy.ndarray (480, 640, 3) 

Entonces creo un QImage QImage usando img :

 qimg = QImage( data=img, width=img.shape[1], height=img.shape[0], bytesPerLine=img.strides[0], format=QImage.Format_Indexed8) 

Pero da un error diciendo que:

TypeError: ‘data’ es un argumento de palabra clave desconocido

Pero dicho en esta documentación, el constructor debe tener un argumento llamado data .

    Estoy usando el entorno anaconda para ejecutar este proyecto.

    versión opencv = 3.1.4

    versión pyqt = 5.9.2

    versión numpy = 1.15.0

    Lo que están indicando es que los datos se requieren como parámetro, no que la palabra clave se llame datos, el siguiente método realiza la conversión de una imagen numpy / opencv a QImage:

     from PyQt5.QtGui import QImage, qRgb import numpy as np import cv2 gray_color_table = [qRgb(i, i, i) for i in range(256)] def NumpyToQImage(im): qim = QImage() if im is None: return qim if im.dtype == np.uint8: if len(im.shape) == 2: qim = QImage(im.data, im.shape[1], im.shape[0], im.strides[0], QImage.Format_Indexed8) qim.setColorTable(gray_color_table) elif len(im.shape) == 3: if im.shape[2] == 3: qim = QImage(im.data, im.shape[1], im.shape[0], im.strides[0], QImage.Format_RGB888) elif im.shape[2] == 4: qim = QImage(im.data, im.shape[1], im.shape[0], im.strides[0], QImage.Format_ARGB32) return qim img = cv2.imread('/path/of/image') qimg = NumpyToQImage(img) assert(not qimg.isNull()) 

    o puedes usar la biblioteca qimage2ndarray

    Cuando se usan los índices para recortar la imagen solo se está modificando la shape pero no los data , la solución es hacer una copia

     img = cv2.imread('/path/of/image') img = np.copy(img[200:500, 300:500, :]) # copy image qimg = NumpyToQImage(img) assert(not qimg.isNull()) 

    Sospecho que está cometiendo un error con TypeError: 'data' is an unknown keyword argument porque ese es el primer argumento que encuentra.

    La referencia de clase vinculada es para PyQt4, para PyQt5 se vincula a la documentación de C++ en https://doc.qt.io/qt-5/qimage.html , pero las similitudes son claras.

    PyQt4 :

    QImage .__ init__ ( propio , datos de bytes, ancho int, alto int, int bytesPerLine , formato )

    Construye una imagen con el ancho, alto y formato dado, que usa un búfer de memoria existente, datos. El ancho y la altura se deben especificar en píxeles. bytesPerLine especifica el número de bytes por línea (zancada).

    PyQt5 (C ++):

    QImage (const uchar * data , int ancho , int alto , int bytesPerLine , QImage :: Formato de formato , QImageCleanupFunction cleanupFunction = nullptr, void * cleanupInfo = nullptr)

    Construye una imagen con el ancho, alto y formato dado, que usa un búfer de memoria existente, datos. El ancho y la altura se deben especificar en píxeles. bytesPerLine especifica el número de bytes por línea (zancada).

    Por los ejemplos en https://www.programcreek.com/python/example/106694/PyQt5.QtGui.QImage , puede probar

     qimg = QImage(img, img.shape[1], img.shape[0], img.strides[0], QImage.Format_Indexed8) 

    (sin los datos = , ancho = , etc)