消除Python OpenCV显示摄像头画面的延迟

问题描述

用 Python 通过 OpenCV显示摄像头画面时,如果对视频帧进行一些处理,常常会遇到一个问题,显示的画面比真实场景慢几秒甚至更多,给用户的体验不好。

画面延迟原因

由于对图像帧进行处理会消耗一些时间,而低层读帧缓存队列保存有图像,用read()方法读出是缓存里的帧,不是摄像头当前的帧。也就出现了延迟。

解决方法

自定义1个无缓存读视频的接口类,实现方法:
1) 建立1个队列
2) 开启1个子线程实时读取摄像头视频帧,队列中总是保存最后一帧,删除旧帧。
3) 显示时,从新接口的队列中取帧。

实现代码

import cv2
import queue
import threading
import time

# 自定义无缓存读视频类
class VideoCapture:
    """Customized VideoCapture, always read latest frame"""
    
    def __init__(self, name):
        self.cap = cv2.VideoCapture(name)
        self.q = queue.Queue(maxsize=3)
        self.stop_threads = False    # to gracefully close sub-thread
        th = threading.Thread(target=self._reader)
        th.daemon = True
        th.start()

    # 实时读帧,只保存最后一帧
    def _reader(self):
        while not self.stop_threads:
            ret, frame = self.cap.read()
            if not ret:
                break
            if not self.q.empty():
                try:
                    self.q.get_nowait() 
                except queue.Empty:
                    pass
            self.q.put(frame)

    def read(self):
        return self.q.get()
    
    def terminate(self):
        self.stop_threads = True
        self.cap.release()
        

cap = VideoCapture(0)
while True:
    time.sleep(0.10)   # 模拟耗时操作,单位:秒
    frame = cap.read()
    cv2.imshow("frame", frame)
    if chr(cv2.waitKey(1)&255) == 'q':
        cap.terminate()
        break

即使对视频帧的处理时间过长,会出现卡顿,但画面还是实时的。
实际应用时,可以对本例代码进行改进。

你可能感兴趣的:(opencv,python,人工智能,视频)