将PyQt5 QPixmap转换为numpy ndarray

时间:2017-07-10 20:05:09

标签: python numpy pyqt pyqt5 qpixmap

我有pixmap:

pixmap = self._screen.grabWindow(0,
                                 self._x, self._y,
                                 self._width, self._height)

我想将其转换为OpenCV格式。 我试图将它转换为numpy ndarray,如here所述,但我收到错误sip.voidptr object has an unknown size

有没有办法获得numpy数组(与cv2.VideoCapture读取方法返回的格式相同)?

3 个答案:

答案 0 :(得分:3)

我使用此代码获得了numpy数组:

channels_count = 4
pixmap = self._screen.grabWindow(0, self._x, self._y, self._width, self._height)
image = pixmap.toImage()
s = image.bits().asstring(self._width * self._height * channels_count)
arr = np.fromstring(s, dtype=np.uint8).reshape((self._height, self._width, channels_count)) 

答案 1 :(得分:2)

可以通过以下方式避免复制:

channels_count = 4
pixmap = self._screen.grabWindow(0, self._x, self._y, self._width, self._height)
image = pixmap.toImage()
b = image.bits()
# sip.voidptr must know size to support python buffer interface
b.setsize(self._height * self._width * channels_count)
arr = np.frombuffer(b, np.uint8).reshape((self._height, self._width, channels_count))

答案 2 :(得分:0)

这里有一个功能:

def QPixmapToArray(pixmap):
    ## Get the size of the current pixmap
    size = pixmap.size()
    h = size.width()
    w = size.height()

    ## Get the QImage Item and convert it to a byte string
    qimg = pixmap.toImage()
    byte_str = qimg.bits().tobytes()

    ## Using the np.frombuffer function to convert the byte string into an np array
    img = np.frombuffer(byte_str, dtype=np.uint8).reshape((w,h,4))

    return img