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)