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

Python 在QGraphicsView中播放图像序列(神秘的内存泄漏),python,opencv,pyqt,pyqt5,qgraphicsview,Python,Opencv,Pyqt,Pyqt5,Qgraphicsview,我正在尝试处理一个图像序列,并使用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继承自qgraphics

我正在尝试处理一个图像序列,并使用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
继承自
qgraphicscene

  def set_qimage(self, qimage):
        self.pixmap = QPixmap.fromImage(qimage)
        self.addPixmap(self.pixmap)
问题是每次我调用
addPixmap()
时,图像只是添加到所有其他图像的顶部,很快我就会耗尽内存,所有内容都崩溃。 当前代码不包括任何处理步骤,它只是将numpy ndarry转换为QImage并将QPixmap添加到场景中


更新QGraphicscene的正确方法是什么,以便我可以流式处理一系列图像?

每次使用
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_())

我试图制作一个10-30 fps左右的视频。我正在使用OpenCV进行处理。@eyllanesc处理可能需要一段时间,但现在我有一个简单的例子,就是将图像从numpy数组转换为QImage,然后将QPixmap添加到场景中。让我们来看看。