Предположим, я беру изображение с веб-камеры, используя 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
Они указывают, что данные требуются как параметр, а не то, что ключевое слово называется данными, следующий метод делает преобразование изображения 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())
Я подозреваю, что это ошибка в 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 = и т.д.)
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
. Почему это происходит?