Python/OpenCV - 错误的实际相机 FPS 或太慢的程序

Python/OpenCV - Wrong actual camera FPS or too slow routine

我正在使用 python 和 OpenCV 从网络摄像头获取视频。为了录制视频,我需要 FPS 信息。 从 get 属性 of cv.VideoCapture 我得到 30fps:

fps = cap.get(cv.CAP_PROP_FPS)

但是,当我构建读取后续帧的线程时,实际帧率似乎要低得多(~12):

def run(self) -> None:
    log(f'Started frame grabber with FPS = {self.fps}')
    while self.keep_grabbing:
        _now = time.perf_counter()
        # frame = self.cap.grab()    # SAME RESULT AS WITH read()
        ret, frame = self.cap.read()   
        now = time.perf_counter()
        log(f'Elapsed Time: {now - _now}')

结果是平均耗时 0.083 秒(约 12fps) 我不明白我的软件是否运行缓慢(但我不知道要更改什么),或者 get 属性 是否返回了错误的 FPS。 有什么建议吗?

问题出在打开相机的 ApiPreference 上。默认情况下,使用 cv.CAP_ANY 暗示问题描述的行为。 API 的自动检测似乎没有有效地工作

特别是 Ubuntu 20.04 以下的 PC 网络摄像头,参数 cv.CAP_V4L 使相机的有效 FPS 为 29.8,非常接近理论值 (30)。

代码变为:

import cv2 as cv
import time

# Here the ApiPreference must be chosen carefully
cap = cv.VideoCapture(0, cv.CAP_V4L)

if not cap.isOpened():
    exit('Camera not opened')

while True:
    _now = time.perf_counter()
    ret, frame = cap.read()
    now = time.perf_counter()
    print(f'Elapsed Time: {now - _now}')
    if not ret:
        exit('Frame not grabbed')