【问题标题】:Convert Python Opencv Image (numpy array) to PyQt QPixmap image将 Python Opencv 图像(numpy 数组)转换为 PyQt QPixmap 图像
【发布时间】:2016-03-17 21:40:31
【问题描述】:

我正在尝试将 python opencv 图像转换为 QPixmap。

我按照说明显示Page Link,我的代码附在下面

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)

代码没有编译和运行时错误,但转换错误,我只是得到一些噪声图像。我不确定问题是什么。有人可以帮忙吗?

【问题讨论】:

    标签: python qt opencv qimage


    【解决方案1】:
    #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)
    

    【讨论】:

      【解决方案2】:

      用这个把cvImage转换成Qimage,这里cvImage是原图。

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

      并将此 Qimage 设置为来自 Qimage 的 Label.setPixmap 参数。好用!!!

      【讨论】:

      • 我必须明确创建QPixmapself.imageLable01.setPixmap(QPixmap(qImg)) 并传递bytesPerLine + 1
      • 任何提到 numpy 格式的文档总是 RGB888 ?
      • 并不总是必须是 RGB888,来自 qt5 文档,doc.qt.io/qt-5/qimage.html#image-formats 支持的格式列表。当然,你必须确保你的 numpy 数组有正确的数据。
      • @MarkCarpenterJr 有没有办法确定我需要哪种图像格式?从您的链接尝试了几个,但没有一个有效。
      • @Matthias 您可以先尝试转换为特定格式,然后再创建QImage()。您还可以查看数组中的元组,并猜测确定格式,例如,RGB888 是每像素 8 位,被认为是 24 位格式,一个像素看起来像 3 个 8 位值; (255,255,255)。一切都取决于你在做什么。
      【解决方案3】:

      只是补充AdityaIntwala的答案,如果图像看起来是红色或蓝色,那是因为格式不是RGB,而是BGR(相反)。在这种情况下,使用 QImage.rgbSwapped 方法更正:

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

      【讨论】:

        【解决方案4】:

        讨厌添加大量答案,但由于这是唯一对我有用的东西,我会这样做,以防其他人遇到同样的问题。

        如上所述here on GitHub

        先将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)
        

        【讨论】:

          【解决方案5】:

          这是我的看法:

          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
          

          【讨论】:

            【解决方案6】:

            有最简单的方法:

            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))
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-06-29
              • 2018-09-05
              • 2018-09-28
              • 1970-01-01
              • 1970-01-01
              • 2014-12-28
              • 2014-05-15
              相关资源
              最近更新 更多