【发布时间】:2019-04-25 05:13:29
【问题描述】:
我正在尝试使用 OpenCV 加载视频文件或从网络摄像头访问视频流,但我无法访问所有帧。
视频文件是以 60 的 FPS 捕获的,但在我的代码中,我每秒只能访问几帧。我尝试使用 OpenCV 的线程版本,imutils。它效果更好,但我仍然无法访问全帧。
在下面的代码中,我使用线程版本的视频阅读器来加载视频文件并将其调整为更小的尺寸以降低所需的处理能力。
抓帧成功后,我会做一些图像处理工作(以后)。但是现在即使有了这个样板,我最多只能读取几(10+)帧,结果也很卡。有没有办法解决这个问题?
import cv2
from imutils import resize
from imutils.video import VideoStream
vs = VideoStream(src="./video.MOV").start()
while True:
frame = vs.read()
if frame is not None:
frame = resize(frame, 800)
# some heavy analytics work
cv2.imshow("Frame", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()
vs.stop()
实验
我在 iMac 和一台配备 1080p 显示器、运行 Intel Core i5-7400 @ 3.00Ghz 的 Ubuntu 机器上进行了一项实验,计算每个 imshow 函数加载的帧数和平均时间。
视频 (h264) 的时长为 1:03 分钟,大小为 185.7MB。
iMac 总共只能加载 414 帧,而 Ubuntu 机器总共可以加载 2826 帧。
两台机器的imshow函数的平均耗时是0.0003s
【问题讨论】:
-
您的 CPU 使用率是否很高,或者一个核心是否 100% 使用?如果不调整大小,它会更好地工作吗?
-
我在 3.4GHz iMac 5k 和 24GB RAM 上运行它,没有在后台运行任何密集程序。在不调整大小的情况下,掉帧非常明显。
-
这是否意味着您的 CPU 使用率在运行时非常低?像 mp4 h264 这样的另一种视频格式是否也很慢,您可以记录调用 imshow 函数的频率(毫秒时间戳)吗?是否每帧调用不止一次?
-
@Harry 我已经用实验更新了帖子。
-
我仍然会对您在系统上的 cpu 进行比较感兴趣,但时钟速度对我来说并不重要。但是,我怀疑 opencv 使用不同的核心技术来抓取/解码帧。可能您可以强制它使用 ffmpeg - 那么两个系统上的结果应该是相同的:docs.opencv.org/3.4/d0/da7/videoio_overview.html - 或者找出当前在 mac 上使用的技术并告诉我。
标签: python opencv image-processing video