web-dev-qa-db-ja.com

Numpy配列からのPyQt5 QImage

次のコードを検討する

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:引数がオーバーロードされた呼び出しと一致しませんでした: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で正しく視覚化されます。私は明らかに何かを逃しています、何か考えはありますか?

乾杯!

5
MagoNick

次のように転置した後にコピーを追加しました:

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

それでうまくいきました。

7
Johan van Breda

Qimage2ndarrayモジュールが1行のコードでニーズに合っているかどうかを確認してください https://pypi.org/project/qimage2ndarray/

yourQImage=qimage2ndarray.array2qimage(yournumpyarray)
3
Dio Nik