来自Numpy Array的PyQt5 QImage

时间:2018-02-06 09:07:48

标签: python python-3.x numpy pyqt pyqt5

考虑以下代码

from PyQt5.QtWidgets import QMainWindow, QLabel, QSizePolicy, QApplication 
from PyQt5.QtGui import QPixmap, QImage                                
from PyQt5.QtCore import Qt                                                                                              
import numpy as np                                                     
import sys



class Test(QMainWindow):                                                                                                                                                                                       

 def __init__(self):                                                                                                                                                                                        
     super().__init__()                                                                                                                                                                                     
     self.initUI()                                                                                                                                                                                          

 def initUI(self):                                                                                                                                                                                          
     self.setGeometry(10,10,640, 400)                                                                                                                                                                       

     pixmap_label = QLabel()                                                                                                                                                                                
     pixmap_label.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)                                                                                                                                   
     pixmap_label.resize(640,400)                                                                                                                                                                           
     pixmap_label.setAlignment(Qt.AlignCenter)                                                                                                                                                              

     im_np = np.ones((1800,2880,3),dtype=uint8)                                                                                                                                                                                  
     im_np = np.transpose(im_np, (1,0,2))                                                                                                                                                                              
     qimage = QImage(im_np, im_np.shape[1], im_np.shape[0],                                                                                                                                                 
                     QImage.Format_RGB888)                                                                                                                                                                 
     pixmap = QPixmap(qimage)                                                                                                                                                                               
     pixmap = pixmap.scaled(640,400, Qt.KeepAspectRatio)                                                                                                                                                    
     pixmap_label.setPixmap(pixmap)                                                                                                                                                                         

     self.setCentralWidget(pixmap_label)                                                                                                                                                                    
     self.show()                                                                                                                                                                                            



def main():                                                                                                                                                                                                    
  app = QApplication(sys.argv)                                                                                                                                                                               
  win = Test()                                                                                                                                                                                               
  sys.exit(app.exec_())                                                                                                                                                                                      



if __name__=="__main__":                                                                                                                                                                                       
  main()  

我收到以下错误

  

TypeError:arguments与任何重载调用都不匹配:QImage():   QImage(QSize,QImage.Format):参数1有太多参数   意外类型'numpy.ndarray'QImage(int,int,QImage.Format):   参数1有意外类型'numpy.ndarray'QImage(bytes,int,   int,QImage.Format):参数1有意外类型'numpy.ndarray'
  QImage(sip.voidptr,int,int,QImage.Format):参数1有   意外类型'numpy.ndarray'QImage(bytes,int,int,int,   QImage.Format):参数1有意外类型'numpy.ndarray'
  QImage(sip.voidptr,int,int,int,QImage.Format):参数1有   意外类型'numpy.ndarray'QImage(List [str]):参数1有   意外类型'numpy.ndarray'QImage(str,format:str = None):   参数1具有意外类型'numpy.ndarray'QImage(QImage):   参数1有意外类型'numpy.ndarray'QImage(Any):太多了   参数

根据this post,这可能是由numpy创建视图引起的。 修改行

 im_np = np.array(img)                                                                                                                                                                                  
 im_np = np.transpose(im_np, (1,0,2))                                                                                                                                                                              

im_np = np.array(img)                                                                                                                                                                                  
im_np = np.transpose(im_np, (1,0,2))                                                                                                                                                                              
im_np_cpy = np.copy(im_np)     

产生相同的错误。为了测试我没有传递视图,我打印测试结果

im_np_cpy.base is im_np

这是假的。 使用cv2正确显示图像。 我显然缺少一些东西,任何想法是什么?

干杯!

4 个答案:

答案 0 :(得分:6)

我在转置后添加了一个副本,如下所示:

im_np = np.transpose(im_np,(1,0,2)).copy()

这对我有用。

答案 1 :(得分:2)

只需执行以下操作:

h,w = img.shape
qimage = QImage(img.data, h, w, 3*h, QImage.Format_RGB888)

答案 2 :(得分:1)

只需一行代码,检查模块qimage2ndarray是否适合您的需求 https://pypi.org/project/qimage2ndarray/

yourQImage=qimage2ndarray.array2qimage(yournumpyarray)

答案 3 :(得分:0)

Ivan 的回答简短而优雅,但是当 numpy 使用 (H, W) 顺序时,Qt 使用 (W, H) 顺序。因此,要使其工作,我必须在第二行中交换 w 和 h:

h, w, _ = img.shape
qimage = QImage(img.data, w, h, 3 * w, QImage.Format_RGB888)

(我更愿意对上述答案发表评论,但我没有足够的声誉。)