8

我目前正在从 PyQt 切换到 PySide。

使用 PyQt,我使用我在SO上找到的这段代码转换QImage为:Numpy.Array

def convertQImageToMat(incomingImage):
    '''  Converts a QImage into an opencv MAT format  '''

    incomingImage = incomingImage.convertToFormat(4)

    width = incomingImage.width()
    height = incomingImage.height()

    ptr = incomingImage.bits()
    ptr.setsize(incomingImage.byteCount())
    arr = np.array(ptr).reshape(height, width, 4)  #  Copies the data
    return arr

但是ptr.setsize(incomingImage.byteCount())不适用于 PySide,因为这是PyQtvoid*支持的一部分。

我的问题是:如何将 QImage 转换为Numpy.Array使用 PySide。

编辑:

Version Info
> Windows 7 (64Bit)
> Python 2.7
> PySide Version 1.2.1
> Qt Version 4.8.5
4

3 回答 3

3

诀窍是QImage.constBits()按照@Henry Gomersall 的建议使用。我现在使用的代码是:

def QImageToCvMat(self,incomingImage):
    '''  Converts a QImage into an opencv MAT format  '''

    incomingImage = incomingImage.convertToFormat(QtGui.QImage.Format.Format_RGB32)

    width = incomingImage.width()
    height = incomingImage.height()

    ptr = incomingImage.constBits()
    arr = np.array(ptr).reshape(height, width, 4)  #  Copies the data
    return arr
于 2016-04-15T11:51:48.940 回答
2

PySide 似乎没有提供bits方法。如何使用constBits获取指向数组的指针?

于 2013-11-11T13:11:41.347 回答
2

对我来说,解决方案constBits()不起作用,但以下工作:

def QImageToCvMat(incomingImage):
    '''  Converts a QImage into an opencv MAT format  '''

    incomingImage = incomingImage.convertToFormat(QtGui.QImage.Format.Format_RGBA8888)

    width = incomingImage.width()
    height = incomingImage.height()

    ptr = incomingImage.bits()
    ptr.setsize(height * width * 4)
    arr = np.frombuffer(ptr, np.uint8).reshape((height, width, 4))
    return arr
于 2018-11-21T06:04:23.570 回答