2017-02-28 11 views
0

opencv를 사용하여 60fps의 1920x1080 HD 카메라에서 비디오 스트림을 보내려고합니다. 문제는 스트리밍과 관련이 없지만 메모리 누수가있는 경우 스트리밍 시작 후 1 분 이내에 거의 6GB의 메모리가 손실됩니다. 이걸 어떻게 막을 지 도와주세요. I는 시간 전화, 메모리 누출이 느리게 증가되는 경우, 메모리 누출이 self.timer.start (30)이다OpenCV : QPixmap 사용 중 메모리 누수가 발생했습니다.

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_()) 

EDIT

I 발견. 메모리 누수를 막는 방법에 대한 제안이 있으십니까?

답변

1

같은 문제를 가진 사람이,이 라이브러리를 qimage2ndarray 가져 함수 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 memory leak 
    self.image_label.setPixmap(QPixmap.fromImage(image)) 
에 다음과 같은 변경 사항을 추가하십시오