我有一些非常简单的性能测试代码,用于在2011年末的Macbook Pro上使用OpenCV 3.1 + Python3测量我的网络摄像头的FPS:
cap = cv2.VideoCapture(0)
count = 0
start_time = time.perf_counter()
end_time = time.perf_counter()
while (start_time + 1) > end_time:
count += 1
cap.read()
# Attempt to force camera FPS to be higher
cap.set(cv2.CAP_PROP_FPS, 30)
end_time = time.perf_counter()
print("Got count", count)
不执行任何处理,甚至不显示图像或在另一个线程中执行此操作,我只能获得大约15 FPS。
尝试使用cap.get(cv2.CAP_PROP_FPS)访问摄像机的FPS我得到0.0。
任何想法为什么?
我已经在互联网上搜索了相当数量的答案,所以我一直在思考:
我使用发布标志构建OpenCV,因此它不应该执行额外的调试逻辑
尝试每帧手动设置FPS(见上文)
我与其他应用的FPS(例如Chrome中的相机玩具)是30FPS
主线程上的应用程序中没有进行任何工作,因此将视频捕获逻辑放在另一个线程中,因为大多数其他帖子建议不应该有所作为
**编辑** 其他细节:看起来我捕获的第一帧很快,然后后续帧慢;看起来这可能是一个缓冲区问题(即在第一帧之后相机被暂停,因为必须分配一个新的缓冲区来写入?)
调整代码以计算每次读取后到目前为止的平均FPS:
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_CONVERT_RGB, False)
cap.set(cv2.CAP_PROP_FPS, 30)
start_time = time.perf_counter()
count = 0
cv2.CAP_PROP_FPS
end_time = time.perf_counter()
while True:
count += 1
ret, frame = cap.read()
end_time = time.perf_counter()
print("Reached FPS of: ", count / (end_time - start_time))
我得到一帧大约30FPS,然后后续帧慢:
达到FPS:27.805818385257446
达到FPS:19.736237223924398
达到FPS:18.173748156583795
达到FPS:17.214809956810114
达到FPS:16.94737657138959
达到FPS:16.73624509452099
达到FPS:16.33156408530572
**编辑** 从10/20开始仍然没有运气。我最好的选择是内存传输存在一些问题,因为相机本身可以根据其他应用程序的能力以30 FPS最终捕获。
答案 0 :(得分:1)
IT'不是回答。由于原始问题中的评论太长,无法引起您的注意。我在外面发帖。
首先,当CV_CAP_PROP_FPS返回0时,它是正常的.OpenCV for Python只是OpenCV C ++的包装器。据我所知,此属性仅适用于视频文件,而不适用于相机。你必须自己计算FPS(就像你编辑的那样)。
其次,OpenCV有一个错误,总是将图像从相机转换为RGB https://github.com/opencv/opencv/issues/4831。普通相机通常使用YUYV颜色。这花费了很多时间。您可以检查所有支持的分辨率+ fps https://trac.ffmpeg.org/wiki/Capture/Webcam。我看到一些相机不支持RGB颜色和OpenCV强制获取RGB并采取可怕的FPS。由于相机限制,在相同的编解码器中,分辨率越高,fps越慢。在不同支持的编解码器中,相同分辨率下的输出越大,fps越慢。例如,我的相机支持yuyv和mjpeg,高清分辨率,YUYV最大10 fps,而MJPEG最大30 fps。
所以,首先你可以尝试使用ffmpeg可执行文件来获取帧。在确定错误来自哪里之后,如果ffmpeg运行良好,您可以使用ffmpeg库(而不是ffmpeg可执行文件)从您的相机获取帧(OpenCV使用ffmpeg用于大多数视频I / O,包括相机)。
请注意,我只使用C ++语言中的ffmpeg和OpenCV,而不是Python。使用ffmpeg库是另一个长篇故事。
祝你好运!