Конструктор `QImage` имеет неизвестное ключевое слово` data`

1

Предположим, я беру изображение с веб-камеры, используя opencv.

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

Затем я создаю QImage qimg с помощью img:

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

Но это приводит к ошибке, говорящей о том, что:

TypeError: 'data' - неизвестный аргумент ключевого слова

Но в этой документации конструктор должен иметь аргумент с именем data.

Я использую среду anaconda для запуска этого проекта.

opencv version = 3.1.4

версия pyqt = 5.9.2

numpy version = 1.15.0

Теги:
opencv
pyqt5
pyqt
qimage

2 ответа

1
Лучший ответ

Они указывают, что данные требуются как параметр, а не то, что ключевое слово называется данными, следующий метод делает преобразование изображения numpy/opencv в QImage:

from PyQt5.QtGui import QImage
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 qimg
    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())
  • 0
    У меня есть другая проблема в этом же контексте. Если я обрежу изображение с помощью img = img[200:500, 300:500, :] ,: img = img[200:500, 300:500, :] , то создаю qimg с qimg = QImage(img.data, img.shape[1], img.shape[0], img.strides[0], qformat) , затем он сообщает об ошибке TypeError: arguments did not match any overloaded call . Почему это происходит?
  • 0
    @RahatZaman посмотри мой ответ, ты должен быть np.copy ()
Показать ещё 4 комментария
1

Я подозреваю, что это ошибка в TypeError TypeError: 'data' is an unknown keyword argument потому что это первый аргумент, с которым он сталкивается.

Ссылка связанного класса предназначена для PyQt4, для PyQt5 она ссылается на документацию C++ на https://doc.qt.io/qt-5/qimage.html, но сходства ясны.

PyQt4:

QImage.__ init__ (self, bytes data, int width, int height, int bytesPerLine, Формат формата)

Создает изображение с заданной шириной, высотой и форматом, в котором используется существующий буфер памяти, данные. Ширина и высота должны быть указаны в пикселях. bytesPerLine указывает количество байтов на строку (шаг).

PyQt5 (C++):

QImage (const uchar * data, int width, int height, int bytesPerLine, QImage :: Формат формата, QImageCleanupFunction cleanupFunction = nullptr, void * 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)

(без данных =, width = и т.д.)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню