当前位置: 首页 > 知识库问答 >
问题:

来自Numpy阵列的PyQt5 QImage

邢财
2023-03-14

考虑到以下代码

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(字节,int,int,int,QImage.Format):参数1具有意外类型“numpy.ndarray”
QImage(sip.voidptr,int,int,int,QImage.Format):参数1具有意外类型“numpy.ndarray”QImage(列表[str]):参数1具有意外类型'numpy.ndarray'QImage(str,格式:str=None):参数1具有意外类型'numpy.ndarray'QImage(QImage):参数1具有意外类型'numpy.ndarray'QImage(任意):参数太多

根据这篇文章,这可能是由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正确显示图像。我显然错过了什么,知道吗?

干杯

共有3个答案

谷梁博易
2023-03-14

Ivan的回答简短而优雅,然而Numpy使用(H,W)顺序,Qt使用(W,H)顺序。因此,为了使它工作,我必须在第二行交换w和h:

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

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

越朗
2023-03-14

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

yourQImage=qimage2ndarray.array2qimage(yournumpyarray)
鲁鹤轩
2023-03-14

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

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

这对我很有效。

 类似资料:
  • 因此,我有两个大小相等的2D numpy数组,都是在两个不同的曲面上使用方法获得的。 数组中的每个值也是形式的数组(所以我基本上有一个带有1D元素的2D数组)。 基本上,我想根据条件对两者进行比较: 有没有更有效的方法可以做到这一点,而无需简单地迭代任何一个数组,如下所示?

  • 包含5911个时间戳 包含5911个样本,每个样本具有20个mfcc特征。 因此,如果您查看 ,它将如下所示: (5911,) (5911, 20) 我想将这两者结合起来,以便: 在R中,我可以简单地 我如何在python中实现这一点? 因此最终数据如下所示: 其中,这些时间1到时间5911只是所需的\u time\u标记中包含的值 我试过: 但出现了这个错误 然后我尝试转置: 但同样的错误: 我

  • 问题内容: 我有一个像这样的3D矩阵 并希望将它们以网格格式堆叠,最后得到 有没有一种方法,而无需明确地对其进行hstacking(和/或vstacking)或添加额外的维度并重塑(不确定这样做是否可行)? 谢谢, 问题答案: In [27]: x = np.arange(16).reshape((4,2,2)) 我在这里发布了用于将数组重塑/取消塑形的更多常规功能。

  • 问题内容: 假设我有一个由列表列表组成的矩阵,如下所示: 同样,假设我有一个具有相同结构的numpy矩阵,称为: 使用numpy,我可以得到这个矩阵的子矩阵,如下所示: 我可以像这样在纯Python中复制numpy矩阵切片: 这不是世界上最容易阅读的东西,也不是最有效的:-) 问题:是否有更简单的方法(在纯Python中)将任意矩阵切片为子矩阵? 问题答案: 您还可以通过定义以下子类来模仿NumP

  • 问题内容: 我有以下内容: 如何在XYZ_2上执行与在XYZ_2上相同的操作?我会以某种方式首先重塑数组吗? 问题答案: 您似乎正在尝试的最后一个轴 与最后一个 。因此,您可以像这样使用- 相关帖子了解。 为了完整起见,在交换的最后两个轴后,我们当然也可以使用,例如- 这将不如一个高效。 运行时测试- 一般而言,涉及张量时,效率要高得多。由于的轴只有一个,因此我们可以通过重整,使用,获取结果并将其

  • 我试图将velocity模板中数组的最后一个元素删除,然后将其连接成字符串,并在下面的“classname”:键中显示结果: 我尝试了几种不同的方法来让数组删除元素并将其连接到一个字符串中,但到目前为止还没有任何运气。 从上面的示例中,我希望实现以下输出。 变量将保存不同长度的字符串,其中有不同数量的要拆分,这样数组的长度就会不同。