gpt4 book ai didi

python - 无法获得超过 ~15 FPS 的 OpenCV 3.1 FPS

转载 作者:行者123 更新时间:2023-11-28 05:28:23 29 4
gpt4 key购买 nike

我在下面有一些非常简单的性能测试代码,用于在 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(见上文)

  • 我的其他应用(例如 Chrome 中的相机玩具)的 FPS 是 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 的速度进行捕捉。

最佳答案

这不是答案。由于原始问题中的评论太长,无法引起您的注意。我改为在外面发帖。

首先,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 库是另一回事。

祝你好运!

关于python - 无法获得超过 ~15 FPS 的 OpenCV 3.1 FPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40055428/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com