python - 是什么导致测量的 fps 与预期但可能的 fps 不同?
问题描述
是什么导致测量的 fps 与预期但可能的 fps 不同?
我的网络摄像头有 30 fps(最大值),而测得的 fps 只有大约 20 fps。
我的代码背后的逻辑:
- 一次迭代显示一帧。
- 一次迭代的总时间是 和
tc
的td
总和d
。 - 总和的倒数是测量的fps。
delay
传递给是通过从期望的倒数中waitKey
减去来计算的 。或者,(毫秒)。tc+td
FPS
delay=(1/FPS - tc - td)*1000
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))
解决方案
根据OpenCV 文档:
该函数
waitKey
无限等待键事件(当delay <= 0
)或delay
毫秒,当它为正时。由于操作系统在切换线程之间有最短时间,因此该函数不会等待delay
毫秒,它会等待至少delay
毫秒,具体取决于当时您计算机上正在运行的其他内容。如果在指定的时间过去之前没有按下任何键,则返回被按下键的代码或 -1。
因此,在我看来(如果我错了,请纠正),waitKey(1)
从网络摄像头流式传输到
- 让网络摄像头本身调整其可能的最大 fps
- 减少由于不可预测的
waitKey
延迟而导致的滞后
推荐阅读
- sql - 如果存在NULL,则排除多个条目的内部联接查询
- android - 单击显示旧数据时使用 RecyclerView 搜索视图
- python - String Join 将 True 视为布尔值而不是字符串
- mysql - 如何将kafka连接到mysql?
- azure - 如何确保通过 Azure 服务总线队列接收我的所有消息?
- go - 练习解决方案中的内存泄漏:等效二叉树?
- shiro - 用于 mongodb 的 Apache shiro ini 文件
- sql-server - 在 bigquery 中交叉应用等效的 MSSQL 运算符
- java - OptaPlanner 是否对链式计划实体上的 ChangeMove 进行了错误的说明?
- spring-cloud - 如何使用 Feign Client 下载 pdf 文件?