Playing image sequence in QGraphicsView (Mysterious Memory Leak)

前端 未结 1 830
说谎
说谎 2021-01-03 12:01

I\'m trying to process an image sequence and make a video of the results using OpenCV and PyQt5. I\'ve got some code that loops through a directory, reads in the images, and

相关标签:
1条回答
  • 2021-01-03 12:11

    Every time you use addPixmap() you are creating a new QGraphicsPixmapItem adding memory unnecessarily. The solution is to create a QGraphicsPixmapItem and reuse it. In addition the processing task can block the main thread so you must use a thread to do the heavy task and send the QImage through signals.

    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_())
    
    0 讨论(0)
提交回复
热议问题