gpt4 book ai didi

python - 在 QGraphicsView 中播放图像序列(神秘的内存泄漏)

转载 作者:太空宇宙 更新时间:2023-11-03 21:50:39 26 4
gpt4 key购买 nike

我正在尝试处理图像序列并使用 OpenCV 和 PyQt5 制作结果视频。我有一些代码在目录中循环,读取图像,并尝试将它们显示在 QGraphicsView 上。

def on_start(self):
for f in self.image_list:
img = cv2.imread(f)
img = cv2qimage(img, False)
self.scene.set_qimage(img)

self.scene 继承自 QGraphicsScene

  def set_qimage(self, qimage):
self.pixmap = QPixmap.fromImage(qimage)
self.addPixmap(self.pixmap)

问题是每次我调用 addPixmap() 时,图像都会添加到所有其他图像之上,很快我就会耗尽内存,一切都会崩溃。当前代码不包含任何处理步骤,它只是将 numpy ndarry 转换为 QImage 并将 QPixmap 添加到场景中。

更新 QGraphicsScene 以便我可以流式传输图像序列的正确方法是什么?

最佳答案

每次使用 addPixmap() 时,您都在创建一个新的 QGraphicsPixmapItem,这会增加不必要的内存。解决方案是创建一个 QGraphicsPixmapItem 并重用它。此外,处理任务可能会阻塞主线程,因此您必须使用线程来完成繁重的任务并通过信号发送 QImage

class ProcessWorker(QObject):
imageChanged = pyqtSignal(QImage)

def doWork(self):
for f in self.image_list:
img = cv2.imread(f)
img = cv2qimage(img, False)
self.imageChanged.emit(img)
QThread.msleep(1)

class Widget(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
lay = QVBoxLayout(self)
gv = QGraphicsView()
lay.addWidget(gv)
scene = QGraphicsScene(self)
gv.setScene(scene)
self.pixmap_item = QGraphicsPixmapItem()
scene.addItem(self.pixmap_item)

self.workerThread = QThread()
self.worker = ProcessWorker()
self.worker.moveToThread(self.workerThread)
self.workerThread.finished.connect(self.worker.deleteLater)
self.workerThread.started.connect(self.worker.doWork)
self.worker.imageChanged.connect(self.setImage)
self.workerThread.start()


@pyqtSlot(QImage)
def setImage(self, image):
pixmap = QPixmap.fromImage(image)
self.pixmap_item.setPixmap(pixmap)


if __name__ == '__main__':
app = QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())

关于python - 在 QGraphicsView 中播放图像序列(神秘的内存泄漏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51129840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com