PyQt / PySide:如何将QImage转换为OpenCV的MAT格式

时间:2013-08-23 15:06:32

标签: python opencv pyqt pyside mat

我正在寻找创建一个函数,用于在PyQt中将QImage转换为OpenCV(CV2)Mat格式。

我该怎么做?到目前为止,我一直在使用的输入图像是作为QImage加载的PNG(RGB或RGBA)。

最终,我想采取两个QImages并使用matchTemplate函数在另一个中找到一个图像,所以如果有更好的方法来做到这一点,我现在也是如此,我也对此持开放态度。但是能够在两者之间来回转换是理想的。

感谢您的帮助,

2 个答案:

答案 0 :(得分:2)

经过多次搜索,我找到了一颗宝石,让我找到了解决方案。我从这个问题的答案中得到了很多代码:https://stackoverflow.com/a/11399959/1988561

我遇到的关键挑战是如何正确使用指针。我认为我遗失的重要事情是setsize函数。

这是我的导入:

import cv2
import numpy as np

这是我的功能:

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

答案 1 :(得分:0)

我尝试了上面给出的答案,但无法获得预期的结果。我尝试了这种粗略的方法,即使用QImage类的save()方法保存图像,然后使用图像文件在cv2中读取图像

这是示例代码

def qimg2cv(q_img):
    q_img.save('temp.png', 'png')
    mat = cv2.imread('temp.png')
    return mat

完成文件操作后,您可以删除生成的临时图像文件。 这可能不是正确的方法,但仍然可以完成所需的工作。