【问题标题】:Qlabel show images too slow its about file size?Qlabel 显示图像的文件大小太慢?
【发布时间】:2021-03-21 20:10:10
【问题描述】:

我尝试在 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 我认为它关于文件大小是否有降低图像质量的选项?

【问题讨论】:

  • Ehm...timeit.timeit() 不返回当前时间,因此您没有测量经过的时间(实际上,它返回的是负值,这没有多大意义)。使用 datetime.now 或 QElapsedTimer 再试一次。
  • 对不起,我随时间更改了它,结果没有太大变化。

标签: python pyqt pyqt5 qlabel


【解决方案1】:

它是关于我在帧读取及其工作之前设置的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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2016-05-21
    相关资源
    最近更新 更多