简体   繁体   English

将 Python Opencv 图像(numpy 数组)转换为 PyQt QPixmap 图像

[英]Convert Python Opencv Image (numpy array) to PyQt QPixmap image

I am trying to convert python opencv image to QPixmap.我正在尝试将 python opencv 图像转换为 QPixmap。

I follow the instruction shows Page Link and my code is attached below我按照说明显示页面链接,我的代码附在下面

img = cv2.imread('test.png')[:,:,::1]/255. 
imgDown = cv2.pyrDown(img)
imgDown = np.float32(imgDown)        
cvRGBImg = cv2.cvtColor(imgDown, cv2.cv.CV_BGR2RGB)
qimg = QtGui.QImage(cvRGBImg.data,cvRGBImg.shape[1], cvRGBImg.shape[0], QtGui.QImage.Format_RGB888)
pixmap01 = QtGui.QPixmap.fromImage(qimg)
self.image01TopTxt = QtGui.QLabel('window',self)
self.imageLable01 = QtGui.QLabel(self)
self.imageLable01.setPixmap(pixmap01)

The code has no compile and runtime error but the conversion is wrong and I just get some noise image.该代码没有编译和运行时错误,但转换错误,我只得到一些噪声图像。 I am not sure what the problem is.我不确定是什么问题。 Could anyone help?有人能帮忙吗?

Use this to convert cvImage to Qimage, here cvImage is the original image.用它来将 cvImage 转换为 Qimage,这里的 cvImage 是原始图像。

height, width, channel = cvImg.shape
bytesPerLine = 3 * width
qImg = QImage(cvImg.data, width, height, bytesPerLine, QImage.Format_RGB888)

and set this Qimage to Label.并将这个 Qimage 设置为 Label。 setPixmap parameter from Qimage.来自 Qimage 的setPixmap参数。 It works!!!有用!!!

Just complementing the answer of AdityaIntwala, if the image appears to be red or blue, it is because the format is not RGB, but BGR (the inverse).只是补充AdityaIntwala的回答,如果图像出现红色或蓝色,那是因为格式不是RGB,而是BGR(反之)。 In this case, use the QImage.rgbSwapped method to correct:在这种情况下,使用 QImage.rgbSwapped 方法来更正:

height, width, channel = cvImg.shape
bytesPerLine = 3 * width
qImg = QImage(cvImg.data, width, height, bytesPerLine, QImage.Format_RGB888).rgbSwapped()
#image is the numpy array that you got from cv2.imread(example_image.jpg)

image = QtGui.QImage(image, image.shape[1],\
                            image.shape[0], image.shape[1] * 3,QtGui.QImage.Format_RGB888)
pix = QtGui.QPixmap(image)

self.scene.addPixmap(pix)

Hate to add to the large number of answers, but as this was the only thing that worked for me I will, in case others run into the same issue.不想添加大量答案,但由于这是唯一对我有用的方法,以防其他人遇到同样的问题。

As mentioned here on GitHub正如在 GitHub 上提到的

Wrap the numpy array/ndarry in a np.require(array, np.uint8, 'C') call first, such as:首先将 numpy 数组/ndarry 包装在np.require(array, np.uint8, 'C')调用中,例如:

arr2 = np.require(arr, np.uint8, 'C')
qImg = QtGui.QImage(arr2, width, height, QtGui.QImage.Format_RGB888)

Here's my take on this:这是我的看法:

def convert_nparray_to_QPixmap(self,img):
    w,h,ch = img.shape
    # Convert resulting image to pixmap
    if img.ndim == 1:
        img =  cv2.cvtColor(img,cv2.COLOR_GRAY2RGB)

    qimg = QImage(img.data, h, w, 3*h, QImage.Format_RGB888) 
    qpixmap = QPixmap(qimg)

    return qpixmap

AdityaIntwala's answer was close but it didnt work for me. AdityaIntwala 的回答很接近,但对我没有用。 the cvImg.data gave an error like 'argument 1 has unexpected type 'memoryview'. cvImg.data 给出了类似“参数 1 具有意外类型‘memoryview’”的错误。 So I have removed the 'cvImg.data' and passed the cvImg.tobytes() as bytes, and it worked所以我删除了'cvImg.data'并将cvImg.tobytes()作为字节传递,并且它有效

height, width, channel = cvImg.shape
bytesPerLine = 3 * width
qImg = QImage(cvImg.tobytes(), width, height, bytesPerLine, QImage.Format_RGB888).rgbSwapped()

then I have set the pixmap as shown below然后我设置了像素图,如下所示

self.imageLabel.setPixmap(QPixmap(qImg))

我建议使用软件包qimage2ndarray将numpy数组与Qimages相互转换。

There is the easiest way:有最简单的方法:

from PIL.ImageQt import ImageQt 
from PIL import Image
from PySide2.QtGui import QPixmap
import cv2


# Convert an opencv image to QPixmap
def convertCvImage2QtImage(cv_img):
    rgb_image = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
    PIL_image = Image.fromarray(rgb_image).convert('RGB')
    return QPixmap.fromImage(ImageQt(PIL_image))
  image=cv2.imread("your_image.png")
  image = QtGui.QImage(image, image.shape[1],image.shape[0], image.shape[1] * 3, QtGui.QImage.Format_BGR888)
  pix = QtGui.QPixmap(image)
  self.image.setPixmap(QtGui.QPixmap(pix))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM