Memory leak while using cv2.VideoCapture()
I am trying to video stream from a 1920x1080 HD camera with 60fps,using opencv. I am losing 6GB of my memory within the first minute of streaming. Any guidelines on how to fix this issue. I am using Python 3.4.4, Opencv 3.1.0, Pycharm Community edition and Pyside to generate the GUI
from PySide.QtCore import * from PySide.QtGui import * import cv2 import sys 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)
image = QImage(frame, frame.shape[1], frame.shape[0],
frame.strides[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_())
try without any gui, i bet, there's no memleaks ..
But I need to embed the video in a GUI. So any suggestions to correct the code to prevent the memory leak would be helpful
I did find out where the memory leak is , its in the timer.start(30) if I increase the number , the memory leak is slow, if the number is zero, the memory leak increases.
unlikely. if you increase the sleep time, the whole thing will just run slower.