pyside / PySide

ATTENTION: This project is deprecated, please refer to PySide2
https://wiki.qt.io/PySide2
GNU Lesser General Public License v2.1
291 stars 66 forks source link

Memory leak while using QPixmap #156

Closed mutenroshi2 closed 7 years ago

mutenroshi2 commented 7 years ago

Hello, I am using Pyside 1.2.2, Pycharm Community Edition, Python 3.4.4, Opencv 3.1.0

I have just built a simple GUI , which displays a HD video streaming (1920x1080) but I lose about 6GB of memory in about a minute, if the timer which is set to 30 milliseconds is set to 250, the video streaming is a little slow and even the memory leak here is the code

`#!/usr/bin/env python

from PySide.QtCore import *
from PySide.QtGui import *
import cv2
import sys
import gc

class MainApp(QWidget):

    def __init__(self):
        QWidget.__init__(self)
        self.video_size = QSize(1920, 1080)
        self.setup_ui()
        self.setup_camera()

    def setup_ui(self):
        """Initialize widgets.
        """
        self.image_label = QLabel()
        self.image_label.setFixedSize(self.video_size)

        self.quit_button = QPushButton("Quit")
        self.quit_button.clicked.connect(self.close)

        self.main_layout = QVBoxLayout()
        self.main_layout.addWidget(self.image_label)
        self.main_layout.addWidget(self.quit_button)
        self.setLayout(self.main_layout)

   def setup_camera(self):
        """Initialize camera.
        """
        self.capture = cv2.VideoCapture(0)
        self.capture.set(cv2.CAP_PROP_FRAME_WIDTH, self.video_size.width())
        self.capture.set(cv2.CAP_PROP_FRAME_HEIGHT, self.video_size.height())

        self.timer = QTimer()
        self.timer.timeout.connect(self.display_video_stream)
        self.timer.start(30)

  def display_video_stream(self):
        """Read frame from camera and repaint QLabel widget.
        """
        _, frame = self.capture.read()
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        # frame = cv2.flip(frame, 1)
        image = QImage(frame, frame.shape[1], frame.shape[0],
                   QImage.Format_RGB888)
        self.image_label.setPixmap(QPixmap.fromImage(image))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MainApp()
    win.show()
    sys.exit(app.exec_())

image

`

mutenroshi2 commented 7 years ago

If anyone having the same issue, please import qimage2ndarray this library and add the following changes to the function display_video_stream

   `def display_video_stream(self):
        """Read frame from camera and repaint QLabel widget.
        """
    _, frame = self.capture.read()

    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    # frame = cv2.flip(frame, 1)
    image = qimage2ndarray.array2qimage(frame) #Solution for the memory leak
    self.image_label.setPixmap(QPixmap.fromImage(image))`