【问题标题】:PyQT, error to load data from a numpy arrayPyQT,从 numpy 数组加载数据时出错
【发布时间】:2014-05-29 10:26:47
【问题描述】:

当我尝试从 numpy 数组设置像素图时,我得到了错误违规访问。

0xC0000005: Access violation reading location 0x0ca00020

需要使用 numpy 数组。无论如何我不会给出问题

这是代码,错误在setPixmap操作中。

    from scipy import misc 
    numpy_image_uint8 = misc.imread('test.jpeg')
    #info_image=images[0]    
    #numpy_image_uint8=info_image.frames[0]
    numpy_image_uint32 = numpy_image_uint8.astype(np.uint32).copy()
    img = (255 << 24 | numpy_image_uint32[:,:,0] << 16 | numpy_image_uint32[:,:,1] << 8 | numpy_image_uint32[:,:,2]).flatten() # pack RGB values 
    imgQ = QImage(img,640,480,QImage.Format_RGB32)
    #imgQ = QImage(QtCore.QString('test.jpeg'))
    self.item.setPixmap(QPixmap.fromImage(imgQ))

此外,还有两个有趣的点:

  • 如果我使用从文件中加载的QImage,它可以工作,如下所示:

    imgQ = QImage(QtCore.QString('test.jpeg'))
    
  • 如果我保存imgQ 变量,保存的图像似乎正确:

    imgQ = QImage(img,640,480,QImage.Format_RGB32)
    imgQ.save("test_image.bmp")
    

【问题讨论】:

    标签: python numpy pyqt qpixmap


    【解决方案1】:

    因为imgQ 与img 共享内存,所以您需要保持img 存活。

    试试这个:

    self.img = img
    imgQ = QImage(self.img,640,480,QImage.Format_RGB32)
    

    您能否提供更多信息说明您为什么这样做?

    【讨论】:

    • 我是 pyqt(和 Qt)的新手,我正在尝试在 UI 中更新 GraphicsView,这是我可以工作的源代码......我不知道哪个有必要“保持活力”变量..这是与python和垃圾收集器有关的问题吗?
    • 为什么将图片加载到数组中,然后再转换成QImage,而不是直接从文件中加载QImage?当垃圾回收器释放img数组时,会释放数据区,QImage会有一个野指针。
    • @carlos.baez 如果您查看 c++ 文档 (qt-project.org/doc/qt-4.8/qimage.html),您会发现传递给 QImage 构造函数的缓冲区必须在 QImage 的整个生命周期内保持有效。由于 QImage 的存在时间与 QPixmap 一样长,因此您的缓冲区 (img) 也必须存在。请注意,某些 Qt 类拥有所创建项目的所有权(例如向布局添加小部件),因此您无需保留引用以防止 Python 对它们进行垃圾收集。但在这种情况下,Qt 并不拥有缓冲区的所有权,因此您必须自己保留它!
    • @HYRY,此代码是应用程序的一部分,我有另一个模块,它使用 ctypes 从网络摄像头加载图像,我使用 numpy 正确转换接收到的数据。我同意,代码很混乱,因为我试图用 numpy 模拟我从相机接收图像,而不是直接加载图像......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    相关资源
    最近更新 更多