首页 > 解决方案 > 是什么导致测量的 fps 与预期但可能的 fps 不同?

问题描述

是什么导致测量的 fps 与预期但可能的 fps 不同?

我的网络摄像头有 30 fps(最大值),而测得的 fps 只有大约 20 fps。

我的代码背后的逻辑:

在此处输入图像描述

import cv2
import time

FPS = 30    # expected fps
fps = FPS   # measured fps
tc = 0.000  # measured time to capture frame
tp = 0.000  # measured time to process frame
d = 0.001   # measured time to wait for pressing ESC key

cap = cv2.VideoCapture(0)
while True:
    # labeling the results of the previous round
    lblTC = f" tc: {int(1000 * tc):4}"
    lblTP = f" tp: {int(1000 * tp):4}"
    lblD = f"  d: {int(1000 * d):4}"
    lblFPS = f"fps: {fps}"

    # measuring time to capture frame
    begin = time.time()
    _, frame = cap.read()
    end = time.time()
    tc = end - begin

    # measuring time to process frame
    begin = time.time()
    frame = cv2.flip(frame, 1)
    frame = cv2.putText(frame, lblTC, (10, 40),
                        cv2.FONT_HERSHEY_PLAIN, 2.5, (0, 128, 255), 2)
    frame = cv2.putText(frame, lblTP, (10, 80),
                        cv2.FONT_HERSHEY_PLAIN, 2.5, (0, 128, 255), 2)
    frame = cv2.putText(frame, lblD, (10, 120),
                        cv2.FONT_HERSHEY_PLAIN, 2.5, (0, 128, 255), 2)
    frame = cv2.putText(frame, lblFPS, (10, 160),
                        cv2.FONT_HERSHEY_PLAIN, 2.5, (0, 128, 255), 2)
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.namedWindow("cam", cv2.WINDOW_NORMAL)
    cv2.imshow("cam", frame)
    end = time.time()
    tp = end - begin

    delay = int((1 / FPS - tc - tp) * 1000)
    if delay < 1:
        delay = 1  # set delay to 1 to prevent forever waiting
    # measuring time to wait for pressing ESC key
    begin = time.time()
    if cv2.waitKey(delay) == 27:
        break
    end = time.time()
    d = end - begin

    # calculating the measured fps
    fps = int(1 / (tc + tp + d))

标签: pythonopencv

解决方案


根据OpenCV 文档

该函数waitKey无限等待键事件(当delay <= 0)或delay毫秒,当它为正时。由于操作系统在切换线程之间有最短时间,因此该函数不会等待delay毫秒,它会等待至少 delay毫秒,具体取决于当时您计算机上正在运行的其他内容。如果在指定的时间过去之前没有按下任何键,则返回被按下键的代码或 -1。

因此,在我看来(如果我错了,请纠正),waitKey(1)从网络摄像头流式传输到

  • 让网络摄像头本身调整其可能的最大 fps
  • 减少由于不可预测的waitKey延迟而导致的滞后

推荐阅读