如何使用 python OpenCV 比文件帧速率更快地处理视频文件?

How to process video files with python OpenCV faster than file frame rate?

我有一个视频文件,我试图一次处理一帧。我尝试使用 VideoCapture class 来阅读以下类型的代码。问题在于,如果视频文件以 25 帧/秒的速度录制,读取也会以相同的速度进行。如何以我的计算机可以解码的速度获取帧?

我打算处理视频流,然后将其存储到文件中。

import cv2
import sys
import time

cap = cv2.VideoCapture(sys.argv[1])
start = time.time()

counter = 0
while True:
    counter += 1;
    image = cap.read()[1]
    if counter %25 == 0:
        print "time", time.time() - start

输出:每 25 帧打印一次时间戳。请注意时间戳如何在每一行几乎准确地改变 1 秒 => 程序每秒处理大约 25 帧。这与视频文件是 25 frames/second.

time 1.25219297409
time 2.25236606598
time 3.25211691856
time 4.25237703323
time 5.25236296654
time 6.25234603882
time 7.252161026
time 8.25258207321
time 9.25195503235
time 10.2523479462

对于此类工作,VideoCapture 可能是错误的 API,但是应该使用什么来代替?

使用 Linux、Fedora 20、opencv-python 2.4.7 和 python 2.7.5.

我还没有尝试过这个,但我认为它可以用于保存在机器上的有限长度的视频文件(即不是实时网络摄像头)。如果算法处理速度不够快,那么算法 "may" 唯一可预见的缺点是跳过帧,但它可能不会读取下一帧。我认为一般来说,VideoCapture 可以比 FPS 读得慢,但不能读得更快。不要引用我的话,但我想我已经注意到了。

使用 VideoCapture::set() 将 FPS 更改为比计算机上的文件更快的值。 CV_CAP_PROP_FPS 是您要更改的内容。

使用 VideoCapture::get() 函数验证 fps 设置是否正确。

如果 opencv 编译时 没有 ffmpeg 支持,我可以重现您描述的行为(即 cv::VideoCapture >> image 锁定到录制视频的帧速率)。如果我编译 opencv with ffmpeg 支持,我可以以我的计算机允许的速度从文件中读取图像。我认为在没有 ffmpeg 的情况下,opencv 使用 gstreamer 并且基本上将视频文件视为播放电影。

如果您正在使用 Linux,this link 会显示您必须安装哪些包才能获得 ffmpeg 对 opencv 的支持。