如何使用python OpenCV处理视频文件,速度比文件帧速率快



我有视频文件,我正在尝试一次处理一帧。我尝试使用VideoCapture类来读取以下类型的代码。问题是,如果视频文件以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 帧/秒的视频文件一起使用。

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。

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

如果您使用的是 Linux,此链接显示您必须安装哪些软件包才能获得对 opencv 的 ffmpeg 支持。

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

使用 VideoCapture::set() 将 FPS 更改为比计算机上的文件更快的速度。CV_CAP_PROP_FPS是你想要改变的。

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

最新更新