从最近的戴尔XPS 9560的内部网络摄像头(1280x720 @ 30fps)捕获时,我意外地获得了非常低的FPS(~16 fps)。
这是我正在使用的简单代码(python3,OpenCV 3.4.0)
import cv2, time
cam = cv2.VideoCapture(0)
n_frames = 0
execution_time = 0
while True:
t_start = time.time()
rv, frame = cam.read()
n_frames+=1
if rv:
#also tried to comment imshow. Same FPS.
cv2.imshow('window', frame)
if cv2.waitKey(1) >= 0:
break
pass
else:
print('Cannot read Frame')
t_end = time.time()
execution_time += (t_end-t_start)*1000
if execution_time > 10000:
print ('avg FPS in 10 seconds: %.2f' % (n_frames*1000/execution_time))
n_frames = 0
execution_time = 0
我试着在C ++中编写相同的简单程序并获得相同的结果,相同的~16 FPS。
有时候,C ++和Python程序都可以在更短的时间内生成更高的FPS。
通过使用i7z监控CPU使用率,我可以看到所有4个核心在大多数时间内以非常低的频率运行,接近最小值,偶尔出现的峰值似乎不会影响平均FPS。
然后我将完全相同的代码传送到Jetson TX1。对于那些不了解它的人来说,它是一个基于ARM的系统芯片,运行专用的Ubuntu 16.10。它连接到USB 2.0相机,1920x1080 @ 25fps。
毋庸置疑,我按预期获得了25 FPS。
有人可以解释这种行为吗?它是否与操作系统级别的差异有关?
如何在任何情况下获得完整的FPS?
感谢您的帮助
编辑:在VTT评论之后,我将相同的外部(假设30 fps)USB摄像头连接到两个系统,我两者都获得了15 FPS。这指向糟糕的相机/ USB总线。我将需要拆除jetson设备内部摄像头并将其连接到笔记本电脑以仔细检查这是与摄像头相关的。
答案 0 :(得分:0)
几天前我追逐另一个问题时,我才无奈地发现了这个问题的答案...我只需要打开灯来找到答案!
事实证明,在光线不足的情况下,我的相机会自动降低FPS。考虑一下,当曝光时间需要长于1/30秒时,肯定会发生这种情况。
因此,最后看起来30 fps应该是“最大fps = 30”。但是它可以而且将会比那更低。我认为这很烦人,太糟糕了,我不得不努力学习。