Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何确保使用OpenCV读取和处理所有帧_Python_Opencv_Image Processing_Video - Fatal编程技术网

Python 如何确保使用OpenCV读取和处理所有帧

Python 如何确保使用OpenCV读取和处理所有帧,python,opencv,image-processing,video,Python,Opencv,Image Processing,Video,我正在尝试使用OpenCV加载视频文件或从网络摄像头访问视频流,但无法访问所有帧 视频文件是以每秒60帧的速度捕获的,但在我的代码中,每秒只能访问几帧。我尝试使用OpenCV的线程版本,imutils。它工作得更好,但我仍然无法访问完整帧 在下面的代码中,我使用线程版本的视频读取器加载视频文件,并将其调整为较小的大小,以降低所需的处理能力 成功抓取帧后,我会做一些图像处理工作(将来)。但是现在,即使有了这个样板,我最多只能读几个(10+)帧,结果也是口吃。有办法解决这个问题吗 import cv

我正在尝试使用OpenCV加载视频文件或从网络摄像头访问视频流,但无法访问所有帧

视频文件是以每秒60帧的速度捕获的,但在我的代码中,每秒只能访问几帧。我尝试使用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和Ubuntu机器上加载的帧数和每个
imshow
函数所用的平均时间,这台机器在1080p显示器上运行Intel Core i5-7400@3.00Ghz

视频(h264)的持续时间为1:03分钟,大小为185.7MB

iMac总共只能加载414帧,而Ubuntu机器总共可以加载2826帧


这两台机器的
imshow
功能的平均时间为
0.0003s

基本上,您只需加载视频和显示,因此没有任何理由会获得如此低的fps,除非您使用的是带视网膜屏幕的Macbook。也许这就是导致视频显示缓慢的原因,因为视网膜屏幕的像素要多得多,合成引擎在屏幕上渲染图像可能需要时间。我建议使用外部屏幕。

您的CPU使用率高还是一个内核的利用率为100%?它在不调整大小的情况下工作得更好吗?我在一个3.4GHz的iMac 5k上运行它,带有24GB的RAM,没有任何密集的程序在后台运行。如果不调整帧的大小,帧的下降是非常明显的。这是否意味着您的CPU使用率在运行时非常低?像mp4 h264这样的另一种视频格式是否也很慢,您能否记录调用imshow函数的频率(毫秒时间戳)?是不是每帧调用不止一次?@Harry我已经用实验更新了帖子。不过我还是对系统上CPU的使用情况感兴趣。相比之下,时钟速度对我来说并不重要。然而,我怀疑opencv使用不同的核心技术来捕获/解码帧。可能你可以强迫它使用FFMPEG——那么在两个系统上的结果应该是一样的:-或者选择在MAC上使用什么技术并告诉ME。请考虑给出一个实际的解决方案。问题出在代码中。这样你就可以帮助其他有类似问题的人