首页 > 解决方案 > Qlabel 显示图像的文件大小太慢?

问题描述

我尝试在 QLabel 上显示视频帧,我使用 opencv videocaptue 并使用 Qtimer 在 QLabel 中显示帧。但是帧来得太慢了,他们来晚了大约 5 秒。

这是我的类构造函数:

        self.vid = cv2.VideoCapture(0)
        self.timer = QTimer()
        self.timer.timeout.connect(self.record)

这是我的记录功能,每秒钟调用一次self.timer.start(1000)

    def record(self):
        start = time.time()
        self.parent.timerLabel.setTimerText()
        ret, frame = self.vid.read()
        new = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        self.parent.setImageToLabel(new)
        end = time.time()
        print(end - start)

setImageToLabel 函数:

    def setImageToLabel(self, frame):
        if type(frame) == str:
            pixmap = QPixmap(QImage(frame))
            pixmap = pixmap.scaled(320, 240)
            self.videoFrame.setPixmap(pixmap)
        else:
            height, width, channel = frame.shape
            self.videoFrame.setPixmap(QPixmap.fromImage(QImage(frame.data, width, height, QImage.Format_RGB888)))


这是每秒钟的处理时间:

0.8245744705200195
0.004508256912231445
0.0037131309509277344
0.0024259090423583984
0.002048969268798828
0.0022318363189697266

它不是那么高

我保存帧和帧大小为 640x480px,文件大小约为 480kB 我认为它与文件大小有关,有没有降低图像质量的选项?

标签: pythonpyqtpyqt5qlabel

解决方案


它大约是我设置的帧大小cv2.CAP_PROP_FRAME_WIDTHcv2.CAP_PROP_FRAME_HEIGHT帧读取及其工作之前。

    def record(self):
        start = time.time()
        self.parent.timerLabel.setTimerText()
        self.vid.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
        self.vid.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
        ret, frame = self.vid.read()
        new = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        self.parent.setImageToLabel(new)
        end = time.time()
        print(end - start)

之后我从 QPixmap 缩放并显示我的屏幕。

    def setImageToLabel(self, frame):
        if type(frame) == str:
            pixmap = QPixmap(QImage(frame))
            pixmap = pixmap.scaled(1000, 600)
            self.videoFrame.setPixmap(pixmap)
        else:
            height, width, channel= frame.shape
            pixmap = QPixmap(QImage(frame.data, width, height, QImage.Format_RGB888))
            pixmap = pixmap.scaled(1000, 600)
            self.videoFrame.setPixmap(pixmap)

推荐阅读