QImage构造函数的关键字data未知

时间:2018-07-31 06:48:53

标签: python opencv pyqt pyqt5 qimage

假设我正在使用opencv从网络摄像头拍摄图像。

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

然后我使用QImage创建一个img qimg:

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

但是它给出了一个错误:

  

TypeError:“数据”是未知的关键字参数

但是在this文档中说,构造函数应该有一个名为data的参数。

我正在使用anaconda环境来运行此项目。

  

opencv版本= 3.1.4

     

pyqt版本= 5.9.2

     

numpy版本= 1.15.0

2 个答案:

答案 0 :(得分:2)

它们所指示的是需要将数据作为参数,而不是将关键字称为data,以下方法将numpy / opencv图像转换为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())

或者您可以使用qimage2ndarray

使用索引裁剪图像仅修改shape而不修改data时,解决方案是进行复制

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

答案 1 :(得分:1)

我怀疑它与TypeError: 'data' is an unknown keyword argument出错,因为这是它遇到的第一个参数。

链接的类参考是针对PyQt4的,对于PyQt5,它链接至https://doc.qt.io/qt-5/qimage.htmlC++文档,但是很相似。

  

PyQt4

     

QImage .__ init__(自身,字节数据,整数宽度,整数高度,整数 bytesPerLine ,格式为 format

     

使用给定的宽度,高度和格式构造图像,该图像使用现有的内存缓冲区数据。宽度和高度必须以像素为单位指定。 bytesPerLine指定每行的字节数(跨度)。

     

PyQt5 (C ++):

     

QImage(const uchar * data ,int width ,int height ,int bytesPerLine ,QImage ::格式 format ,QImageCleanupFunction cleanupFunction = nullptr,无效 * cleanupInfo = nullptr)

     

使用给定的宽度,高度和格式构造图像,该图像使用现有的内存缓冲区数据。宽度和高度必须以像素为单位指定。 bytesPerLine指定每行的字节数(跨度)。

根据https://www.programcreek.com/python/example/106694/PyQt5.QtGui.QImage上的示例,您可以尝试

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

(没有 data = width = 等)