ImageItem 在显示来自相机的帧一分钟后崩溃

ImageItem crashing after a minute of displaying frames from camera

我有一个 PyQtGraph 小部件,用于显示来自帧抓取器的已处理数组。一个线程获取这些数据并将这些数据放入队列中,另一个线程从队列中获取这些数据并在我的小部件上调用更新(数据)。数据是一个比较小的(400*100)numpy数组

class BScanView(PyQtG.GraphicsLayoutWidget):

    def __init__(self, aspect=0.5):
        super().__init__()
        self.aspect = aspect

        self.viewbox = self.addViewBox(row=1,col=1)
        self.viewbox.setAspectLocked()
        self.image = PyQtG.ImageItem()
        self.viewbox.addItem(self.image)

    def update(self, data):
        self.image.clear()
        self.image.setImage(data, autoLevels=False, levels=(-100, -2))
        QtGui.QGuiApplication.processEvents()

这可以工作一段时间,但随机会导致 ImageItem 崩溃。 GUI 的其余部分可以很好地供后续使用,但上面的小部件没有响应。

很难说,因为我无法重现您的问题,但我可以想到一些潜在的原因。

  1. 可能 data 数组的底层数据缓冲区在线程之间共享并且更新不正确。在用 self.image.setImage(np.copy(data),...
  2. 在图像中设置它之前,尝试制作数组的副本
  3. GraphicsLayoutWidgetQWidget 的后代,因此具有 update 方法。您使用不同的签名覆盖它。我不知道 PyQt 能准确处理这个问题,但请尝试将您的方法重命名为 updateImage 并查看它是否有所作为。
  4. 为什么要使用 processEvents?你在这里应该不需要它。

您的代码示例不是 MVCE,因为它不完整;缺少有关如何在另一个线程中创建数据的信息。百分百的完整性并不总是可以实现的(外部库等),但请尝试使其尽可能完整。要制作一个完整的、最小的 and 可验证示例可能需要大量工作,但您付出的努力越多,您得到的答案就越多,它们也会越好。