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 的其余部分可以很好地供后续使用,但上面的小部件没有响应。
很难说,因为我无法重现您的问题,但我可以想到一些潜在的原因。
- 可能
data
数组的底层数据缓冲区在线程之间共享并且更新不正确。在用 self.image.setImage(np.copy(data),...
在图像中设置它之前,尝试制作数组的副本
GraphicsLayoutWidget
是 QWidget
的后代,因此具有 update
方法。您使用不同的签名覆盖它。我不知道 PyQt 能准确处理这个问题,但请尝试将您的方法重命名为 updateImage
并查看它是否有所作为。
- 为什么要使用
processEvents
?你在这里应该不需要它。
您的代码示例不是 MVCE,因为它不完整;缺少有关如何在另一个线程中创建数据的信息。百分百的完整性并不总是可以实现的(外部库等),但请尝试使其尽可能完整。要制作一个完整的、最小的 and 可验证示例可能需要大量工作,但您付出的努力越多,您得到的答案就越多,它们也会越好。
我有一个 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 的其余部分可以很好地供后续使用,但上面的小部件没有响应。
很难说,因为我无法重现您的问题,但我可以想到一些潜在的原因。
- 可能
data
数组的底层数据缓冲区在线程之间共享并且更新不正确。在用self.image.setImage(np.copy(data),...
在图像中设置它之前,尝试制作数组的副本
GraphicsLayoutWidget
是QWidget
的后代,因此具有update
方法。您使用不同的签名覆盖它。我不知道 PyQt 能准确处理这个问题,但请尝试将您的方法重命名为updateImage
并查看它是否有所作为。- 为什么要使用
processEvents
?你在这里应该不需要它。
您的代码示例不是 MVCE,因为它不完整;缺少有关如何在另一个线程中创建数据的信息。百分百的完整性并不总是可以实现的(外部库等),但请尝试使其尽可能完整。要制作一个完整的、最小的 and 可验证示例可能需要大量工作,但您付出的努力越多,您得到的答案就越多,它们也会越好。