pyqt5 讀取相機鏡頭的 frame 時,螢幕畫面會一直閃

問題:

工作上遇到了用 pyqt5 顯示畫面,結果螢幕一直閃的問題。

一開始以為是線程的問題,在 vs code 用 debug 模式看半天,把 code 都 print 出來,發現還是無解。

後來又以為是 .ui 檔圖層沒有設定好的問題,圖層調了半天也無解。

最後被同事一語道破:你處理 rgb frame 的時候有沒有 sleep ?

我: ??

解法:

在 qt 需要顯示 rgb frame 的地方,我們會用 while 迴圈一直去跑,因為讀取的速度太快,qt 來不及處理畫面顯示就跳下一張 frame ,所以會一直閃。

所以每處理完,顯示完一張 frame 之後讓他睡個 0.015 秒,問題解決!

上 code: (以下為示意 code 沒辦法真的跑起來噢!)

  1. 設定 QT image →顯示 rgb frame

    def qt_show_rgb_frame(rgb_frame):
        ... # rgb_frame 前處理成 rgbImage
        convertToQtFormat = QImage(
                rgbImage.data, w, h, bytesPerLine, QImage.Format_RGB888
            )
        display_frame = convertToQtFormat.scaled(800, 480)
        self.controller.setFrameImage.emit(display_frame)
    
  2. 用 while 迴圈跑 show_rgb_frame(rgb_frame) 時,每跑完一個迴圈要 sleep 0.015 秒

    import time
    while True:
        rgb_frame = self.rgb_camera.read()
        ... # 其他邏輯
        self.view.qt_show_rgb_frame(rgb_frame) # 顯示 qt rgb frame 的 function
        time.sleep(0.015) # 讓它睡!
    

同事真的太強大了

Comments

Popular posts from this blog

《 Imgproxy 使用分析一:圖片下載速度優化分析:Akamai CDN vs Imgproxy 效能比較》

《 Akamai + S3 與 CloudFront + Imgproxy + S3 使用分析二:壓縮圖片設計流程:檔案大小 vs 載入時間的權衡》

PostgreSQL 具有的 NoSQL 特性