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')
我正在使用 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')